JS整数演算ベンチマーク
sid-searchを作り直してみた - oupoの日記で書いたFirefoxだけ劇遅というのはFirebugのコンソールパネルが起動していたからであって消してみたら別に劇遅ではなかった。今回の記事のベンチマークはそれに気づかずに書いたものであるが、ベンチマーク結果をとるときにはちゃんとFirebugのコンソールパネルを終了させてある。
0から40000までの各整数に対してMTで1番目の乱数を得るプログラムをJSで書き、それを各ブラウザで実行したときの速度を測ってみた。
プログラムのバージョンとしては「通常」「整数演算高速化」「整数演算高速化+インライン展開」の3つを用意した。
「整数演算高速化」というのは32ビットの整数をそのまま変数に持つのではなく、16ビットずつ二つに分けて持つように変更したもの。「整数演算高速化+インライン展開」ではさらに、掛け算と足し算のサブルーチンを手でインライン展開した。
通常 | 整数演算高速化 | 整数演算高速化+インライン展開 | |
---|---|---|---|
Firefox 16.0.2 | 1.794 sec | 0.623 sec | 0.363 sec |
IE 9.0.8112.16421 | 2.872 sec | 1.606 sec | 1.389 sec |
Google Chrome 23.0.1271.64 m | 0.491 sec | 0.434 sec | 0.392 sec |
Opera 12.10 | 3.65 sec | 1.715 sec | 1.327 sec |
Safari 5.1.7 (7534.57.2) | 1.966 sec | 1.541 sec | 1.253 sec |
なぜ「整数演算高速化」のような最適化が有効かというと、小さい整数は即値でもつが大きい整数になるとオブジェクトをアロケーションしてしまうからだろう。この最適化は64bit環境だともはや役に立たないかもしれない。