asm.js

 つぶやき, ゲーム, トピック, プログラム
 公開日:2013年3月22日 / 更新日:2013年5月14日

Firefox22がasm.js採用でネイティブに近い実行速度まで高速化。
だそうです。

聞いたことなかったので、
「asm.js」って何ぞ?
と思ったわけですが、

JavaScriptプログラムをネイティブコード速度の2倍程度の実行時間で済むように最適化するJavaScriptサブセット

とのこと。

ベンチマーク的には以下の様な感じになるらしいです。
これはちょっとスゴイのかも、

こちらをざっと参照した感じでは、
どうやら静的型付けを導入することで高速化を図るっぽいようです。
int と double を使い分けできるようになる感じです。
バイナリを扱うような場合に高速化が期待できそうな気がします。

動的型付けなJavaScriptでは、
数値は全てdouble として扱われるようになってます。
Typed Arrayとかあったりしますが使用は限定的)
整数で済むような場合でも倍精度浮動小数点数で処理されるので、
素直な実装ならそれなりにオーバーヘッドがあったりしそうですね。
asm.jsによって、こういうのとかが改善されるってことなのかな?
実装的には Typed Array をうまく使う感じっぽい。

具体的には、
“use asm”;
とか書いて宣言することで導入されるようです。

静的型付けの表記は以下のようにやるそうです。

実に巧妙な表記になってますね(^_^;)

本来なら、

とかActionScript3風味に記述できれば分かりやすいわけですが、
JavaScriptの言語仕様を変えずに巧妙に仕込んでる所がミソなんだと思います。
静的型付けのための巧妙な表記は上記の2種類しかなさそうなので、
int と double に割り振ったということなのでしょうね、たぶん。

ただ基本的には、
C/C++等 -> LLVM -> Emscripten -> JavaScript
という感じに機械的な変換で適用されることを
念頭に置いているみたいです。
人が書くのにはちょっとメンドーそうだし。

★2013/3/29追記。

UE3とかあっさり動かしてしまったようですよ。
自動変換おそるべし(^_^;)

コメント / トラックバック 2 件

  1. Name より:

    最近のJSエンジンは当然intの範囲の整数はintとして演算するなど
    型推論技術を駆使して高速化を測っています

    asm.jsは型チェックを無くし、GCを止め、ほぼ素のメモリを触らせることで高速化する技術です

    • 管理人 より:

      情報ありがとうございます。

      知らない所でエンジンはうまいことやってるんですね。
      なるほど(^_^;)

      GCを止めるということは、
      メモリ管理は自前で処理しないといけないということなのかな?
      そういえば、C++ から Emscripten で変換された ammo.js には、
      Ammo.destroy() とかあったような・・・(^_^;)

コメント投稿