xorshiftとmt19937の速度比較


なんかxorshiftが、速くて、簡単で、美味いとのことなので実装してみた。
で、ついでにstd:mt19937と比較。

  1. Google Chromeが採用した、擬似乱数生成アルゴリズム「xorshift」の数理
  2. Xorshift - Wikipedia

マイクロベンチマーク実効

$ g++ -O3 -Wall -std=gnu++1z xorshift.cpp
$ ./a.out 
31 msec : xorshift32
15 msec : xorshift128
1064 msec : std::random
18 msec : std::mt19937
$ ./a.out 
25 msec : xorshift32
18 msec : xorshift128
1052 msec : std::random
15 msec : std::mt19937
$ ./a.out 
31 msec : xorshift32
18 msec : xorshift128
1064 msec : std::random
16 msec : std::mt19937

結果

xorshift128とmt19937は上記マイクロベンチだと、同じくらい。
std:randomは使わない方がいいな。

結論

一先ずmt19937でいいかな(まあ、ARMとかでやったらまた結果違うんだろうけど^^)

測定環境
$ gcc --version
gcc (Debian 5.3.1-5) 5.3.1 20160101

$ cat /etc/debian_version 
stretch/sid

$ cat /proc/cpuinfo 
...
model name	: Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz
...

P.S. 2017/02/20

試しに図ってみた。

Coretex-A57

LinuxKernel4.6くらいだったような。
/dev/urandomが遅い?

$ aarch64-linux-gnu-g++ -O3 -Wall -std=gnu++1y xorshift.cpp
$ ./a.out 
40 msec : xorshift32
26 msec : xorshift128
27771 msec : std::random
55 msec : std::mt19937

P.S. 2017/02/28

結果が安定してない。

Coretex-A7 700MHz

rasberry pi 2

  • LinuxKernel4.9.11-v7+
  • g++ (Raspbian 4.9.2-10) 4.9.2
$ g++ -O3 -Wall --std=gnu++1y xorshift.cpp
$ ./a.out
72 msec : xorshift32
107 msec : xorshift128
35439 msec : std::random
160 msec : std::mt19937
$ ./a.out
102 msec : xorshift32
83 msec : xorshift128
35637 msec : std::random
160 msec : std::mt19937