Mozillaのasm.jsはJavaScriptの厳密なサブセットだが、Firefox上の処理系/実装系はそれを、通常のJavaScriptのコードよりも相当高速に動かせる。すなわち、Firefoxが内蔵しているJavaScriptエンジンにはOdinMonkeyと呼ばれるモジュールがあって、そのおかげで今年の3月にはasm.jsのコードがネイティブコードの約2倍の所要時間で動くことを実証した*。そして今週のMozillaの発表 では、多くのベンチマークにおいて、ネイティブの1.5倍以下という遅さ(速さ?)にまで接近した。〔*: 約2倍;ネイティブよりもちろん遅いのだけど相当接近した、という意味。2倍よりは1.5倍の方が、もちろん速い。〕
GoogleはNative ClientでWebアプリケーションが、コンパイラを通ったまさにネイティブのコードを実行することをねらっているが、MozillaはJavaScriptをネイティブに近い速さで動かす方に賭けている。両者のやり方は相当違うけど、共通しているのはどちらも、デベロッパがまずCやC++でコードを書き、それをブラウザ内で動かすことだ。Mozillaはそのために、LLVMからJavaScriptへのコンパイルを行うコンパイラEmscriptenを使用する。
ゲームエンジンはCやC++で書かれているものが多いので、asm.jsも主にゲームをねらっている。実際、Mozillaが初めて公開したasm.jsのデモの一つは、ブラウザ内でネイティブに走るEpicのUnreal Engine 3だった。
かつての2倍遅いから今回の1.5倍遅いへの改良は、asm.jsとコンパイラEmscripteの両方をすこしずついじって達成された、とMozillaのAlon ZakaiとRobert Nymanが発表の中で言っている。また、FirefoxのJavaScriptエンジンの改良の効果も大きい。ZakaiとNymanによると、中でもとくにスピードアップに貢献したのは、一部の浮動小数点数演算のの最適化だ。
asm.jsが2倍とか1.5倍と言っている対照のネイティブコードは、C/C++によるオリジナルをgccやclangでコンパイルした結果である。それを、Emscriptenとasm.jsによるコードと比較している。
下図は、最新の結果だ:
〔ブラウザ~HTMLがサイズを縮小しているので、クリックして別画面で見ると原寸で(大きく)見れます。〕
asm.jsは今のところMozillaのプロジェクトだが、GoogleのChromeチームはかねてから気にしていて、最近そのOctaneベンチマークの一員に加えた。Chrome本体がasm.jsを近々サポートすることはないと思うが、asm.jsのコードは、ふつうのJavaScriptコードとしては今のどのJavaScriptエンジンでも動く。Firefoxの上ほど速くないけど。
[原文へ]
(翻訳:iwatani(a.k.a. hiwa))