Labo288

プログラミングのこと、GISのこと、パソコンのこと、趣味のこと

JavaScript(Node.js)とWASMの処理速度比較

はじめに

WASMとはWebAssemblyのこと。最近のブラウザで実行可能なバイナリデータです。 そもそもJavascript(Node.js)は軽量言語にしては速いです。なので通常の用途において、WebAssemblyに置き換えるケースというのはあまり多くないでしょうが、単純な計算を繰り返し実行する必要があり、かつその速度を改善したい場合には、有効な手段と言えるでしょう。

今回はJavaScript(Node.js)とWASMで同じ関数を実行し処理速度を比較してみます。 ブラウザでも使えますが、速度比較の環境を作るのがめんどくさかったのでNode.jsと比較します(たぶんNode.jsの方がブラウザより速いでしょうから、WASM>Node.jsならWASM>ブラウザでしょう)。

WASMのつくりかた

wasm-pack + Rustで作ります(targetはnodejs)

github.com

実行する関数

フィボナッチ関数の第x項を求める関数です。メモ化などしていない素朴な実装。 第30項までを単純なループで実行し、その所要時間を比較します。

// Rust
pub fn fibo(x: u32) -> u32 {
    if x < 3 {
        return 1;
    }
    fibo(x - 1) + fibo(x - 2)
}
//JavaScript
const fiboJs = (idx) => {
    if (idx < 3) return 1
    return fiboJs(idx - 1) + fiboJs(idx - 2)
}

結果

# WASM
finish wasm 8.863149046897888
finish wasm, including init 13.06051504611969
# JavaScript
finish js 18.82902693748474

結論

  • 単純な計算速度の比較だけならWASMが2倍以上速い
  • WASMの初期化で多少のオーバーヘッドが発生する(それでも今回の処理ではWASMの方が速い)

おわりに

  • 関数の実行回数が増えれば増えるほどWASMが有利(WASMの初期化のロスの影響が小さくなるので)