108個の乱数を生成したときの実行時間の測定結果は以下の通り。ただし、複数乱数を生成する場合は1回の関数呼び出しにつき105個の乱数を生成させた。表中のtime[s]は実行時間(単位は秒)、ratioはmt19937arを1とする実行時間の比率である。
表 6.1. x86 (Pentium M 1.6GHz) + Gcc (4.1.2, -O3)での実行速度
表 6.2. PowerPC (G4 1.25GHz) + Gcc (4.1.2, -O3)での実行速度
表 6.3. ARM (X-Scale PXA255 400MHz) + Gcc (3.2.3, -O3)での実行速度
| target | time[s] | ratio |
|---|---|---|
| mt19937ar (normal) | 19.91 | 1 |
| mt19937ar (inlined) | 19.58 | 0.98 |
| SFMT-mt19937-noSIMD-seque (normal) | 43.53 | 2.19 |
| SFMT-mt19937-noSIMD-seque (inlined) | 39.28 | 1.97 |
| SFMT-mt19937-noSIMD-block | 27.68 | 1.39 |
| SFMT-mt607-noSIMD-seque (normal) | 43.97 | 2.21 |
| SFMT-mt607-noSIMD-seque (inlined) | 39.90 | 2.00 |
| SFMT-mt607-noSIMD-block | 28.13 | 1.41 |
| WELL512a | 18.52 | 0.93 |
| WELL1024a | 18.25 | 0.92 |
| xor128 | 11.45 | 0.58 |
| LCG (normal) | 8.46 | 0.42 |
| LCG (inlined) | 1.05 | 0.05 |
| mtlite-mt19937-loop | 11.13 | 0.56 |
| mtlite-mt19937-loop-nt | 9.28 | 0.47 |
| mtlite-mt19937-nonloop | 18.53 | 0.93 |
| mtlite-mt19937-nonloop-nt | 14.98 | 0.75 |
| mtlite-mt19937-block | 14.50 | 0.73 |
| mtlite-mt19937-block-nt | 10.25 | 0.51 |
| mtlite-mt607-loop | 11.66 | 0.59 |
| mtlite-mt607-loop-nt | 9.80 | 0.49 |
| mtlite-mt607-nonloop | 17.73 | 0.89 |
| mtlite-mt607-nonloop-nt | 13.61 | 0.68 |
| mtlite-mt607-block | 15.69 | 0.79 |
| mtlite-mt607-block-nt | 11.20 | 0.56 |
mt-liteについて結果からわかることは次の通りである。ただし、実行環境によって傾向に差異があることに留意すること。
また、比較対象についてわかることは次の通りである。
SFMT.cを直接インクルードし、コンパイラにインライン展開を行うよう指示すると、速度が向上することを示している。ただし、この高速化は他の疑似乱数生成アルゴリズムにおいても有効で、相対的にSFMTが他よりも有利になるとは限らない。また、乱数生成関数を呼び出す箇所が複数のソースコードに存在すると使用できないなどの制約があるrand関数を速度のために用いるときなどは注意した方がよい