メルセンヌツイスタ実装速度比較
メルセンヌツイスタのJava実装いろいろあるけど、どれが一番速いの?ということで比較実験をしてみた。
- ECJライブラリの高速化バージョン(MersenneTwisterFast)
- mantissaライブラリ
- Coltライブラリ
- David Beaumont氏による実装
10の9乗個の乱数を生成し合計を加算に要した時間を計測。実験環境はPen3の1G+メモリ256M+WinXP+JRE1.4.2。
結果。
- java.util.Random(比較用): 7.351sec
- ECJ: 6.509sec
- mantissa: 7.180sec
- Colt: 6.960sec
- David Beaumont: 8.702sec
一番速かったのはECJの高速化バージョン実装。何をしているのかとソースコードを覗いてみると、標準のRandomを継承せず、非同期でマルチスレッド対応せず、さらに共通ルーチンを関数コールせず、手動でinline展開してハードコーディングすることで関数コールのオーバーヘッド削減がワロタwJavaにはC/C++のinline展開最適化が言語として存在しないから、コピペでやるという気合に感動した(つД`)
それにしても標準のRandom速えぇぇぇぇ。線形合同法なので統計的に問題ありだけど、ここまで速いとは想定外。