WebAssemblyはどれくらい速いのか
WebAssembly(WASM)はWebブラウザ上で動くプログラムです。JavaScriptとの違いはコンパイルされた実行ファイルであることで、JavaScriptのようにパースする必要がないので高速に処理されます。
高速とは言っても、どれくらい速いのか実行してみないと分からないでしょう。そこで試した結果を紹介します。
フィボナッチ関数を実行する
フィボナッチ関数はJavaScriptで書くと次のように表現されます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function f(n) { | |
if (n <= 1) return 1; | |
return f(n – 1) + f(n – 2); | |
} |
例えば5のフィボナッチ数は8、6のフィボナッチ数は13になります。小さな数であれば一瞬で求められますが、40くらいの数字になると時間がかかるようになります。同じ関数をRustで書くと次のようになります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pub fn f(n:i32) -> i32 { | |
if n <= 1 { | |
1 | |
} else { | |
f(n – 1) + f(n – 2) | |
} | |
} |
計算する
では実際に計算を行ってみた結果です(macOS Safariでの実行結果。ハードウェアの性能によって数値は異なります)。単位はmsです。
JavaScript | WASM | |
---|---|---|
20 | 2 | 1 |
30 | 69 | 4 |
40 | 6,733 | 423 |
42 | 17,356 | 1,061 |
44 | 46,195 | 2,839 |
この結果から分かるのは、少ない数であればJavaScriptもWebAssemblyも殆ど変わりませんが、40以上になるとWebAssemblyが圧倒的に高速になります。50になるとJavaScript側で処理するのは現実的ではないでしょう。フィボナッチ関数に限らず、リストのソート処理であったり、ループ処理などはWebAssemblyの方が効率的なはずです。
WebAssemblyではネットワーク関数が使えない、DOMが扱えないと言った制限がありますが(現在解消されようとしています)、計算処理の速度においては使わない手はありません。開発できる言語はRustに限らず、様々な言語があります。ぜひWebAssemblyの活用を検討してください。
コメントは受け付けていません。