2013/05/20 (2013年05月 のアーカイブ)
asm.jsでFFTしてみた、のだが。
最近一部で話題の"asm.js"。GIGAZINE:「JavaScriptがネイティブアプリに近い実行速度まで高速化」
たとえばこんな記事があります↑。すんごく期待してしまったわけですよ、これがFirefox22で搭載されると。
特徴としては
- Nativeで書いた時の1/2程度の速度になる
- Javascriptのサブセットなので非対応ブラウザでもそのまま動く
- DOM関連は駄目だけど純粋な数値計算で威力を発揮する
既存のコードが恩恵を受けられる事はほとんどないだろう、とか使い道には色々議論があるようなんですが、これはWebAudio関連の処理と相性が良いに違いない!
て事で正式には6月リリースですがNightlyビルドではもう使えるらしいので、試してみました。ある程度実用になりそうなあたりを狙ってFFTをやらせてみます。
で、書いたのがこちら:asmjstest.html
2048ポイントのFFTを変換/逆変換を繰り返して速度を見ます。元波形は矩形波で変換後の波形(緑、元の矩形波と同じはず)とスペクトル(赤)が表示されます。 FirefoxのNightly以外のブラウザはasm.js非対応なので [ASM]と[NoASM]は同じ結果になります。結果:
時間 | |
---|---|
Firefox ASM,10000回 | 4156 |
Firefox NoASM,10000回 | 6009 |
Chrome 10000回 | 4859 |
IE10 10000回 | 12164 |
あれ、うん...。速い事は速いのだけど。なんかもっとこう爆速な感じを期待してたのだが?
処理にもよるでしょうけど、せいぜい通常のJavascriptの2倍程度の速度を狙う感じでしょうか。stdlib経由で数値関数なんかも使えるのですが、オーバーヘッドが大きいようでできれば使用を避けた方が良いように思います。こうやれば、もっと速くなるよ!! 的なノウハウがないものかと模索してるんですが、なかなかうまくいかんです。
爆速だったら入出力の方法とか色々整備したい所だけど、ちょっとモチベーションが下がりました。せっかく書いたのでおいておきますけど。複素数入力で、正規化する/しないのフラグがあります。汎用性を持たせようとしてたので通常の配列からデータを渡せるようにして、ついでにここでスクランブルまでやっています。
https://github.com/g200kg/Fft-asm.js
なお、asm.jsの仕様はここ http://asmjs.org/spec/latest/
正直結構書くにくいです。簡単に説明すると、
- asm.js化したい関数やファイルに "use asm"; と書く
- 変数は数値のみで文字列やオブジェクトは使えない
- 数値は var i=0; var r=0.0; のように常に型を意識しながら書く
- 配列は通常コードと共有するArrayBuffer、1つのみを使いまわす
他にもたくさん制限があるのでコンソールでasm.js化のエラーが出てないか確認しながら書く感じになります。
「結局 asm.js は名前のせいで過大な期待を煽りすぎなのだと思う。冷静に考えれば、普通のJSの2倍くらいの速度が出るのは凄い事かも知れん」、となんとなくフォローしておく。嫌いじゃないんだよ、この手のやつ。
Posted by g200kg : 2013/05/20 15:03:13