Random Number Generatorによるベンチマーク

Summary
Mersenne Twisterアルゴリズムにより1000万回乱数を発生するのにかかる時間は、Intel(R) Core(TM)2 Duo CPU    L7500  @ 1.60GHzにて以下のとおりであった.

lang  time     time/C  time2   time2/C python 28.845  3.7     4.186   11.3 cython 25.287  3.2     3.041   8.2 perl  24.985   3.2     8.200   22.1 java  58.053   7.4     0.393   1.06 C     7.808    1.0     0.371   1.0 time2はprint文なしの場合である. Javaはprint文を実行すると極端に遅くなる. それさえしなければ乱数発生に関しては速度はCとさほど変わらない!


 * jythonはprint文なしで10万回ループを回すだけで、31.3秒かかる. 1000万回だとその100倍かかるようで、答えが返ってこない. simulationの使い物にはなりません.

Python
print文を止めた場合 (random.randomだけ実行)

Python (PyGSL)
print文を止めた場合.


 * 速くならない.

cython
rng01.pyx

p.py

oogasawa@glowlight:~$ time python p.py > /dev/null

real	0m25.287s user	0m25.258s sys	0m0.028s

print文を止めた場合 oogasawa@glowlight:~$ time python p.py

real   0m3.041s user   0m3.024s sys    0m0.016s pythonに比べて若干速くなる.

Cython (PyGSL)

 * 速くならない.

Java
Build the program.

Run the program.
 * 遅い！

print文を外した場合

Java (GCJ)
SunのJavaでは遅すぎるので、GCJでは改善するか考える.

GCJを使うと、Java言語のソースコードをコンパイルしてネイティブコードを得ることができます. ソースコードではなくて、クラスファイルをコンパイルすることもできます. カレントディレクトリにあるHello.java（リスト1）をコンパイルするためには、次のコマンドを実行します.
 * http://www.shudo.net/article/Fedora-Core-Expert-200507-GCJ/

% gcj -O2 -o Hello --main=Hello Hello.java

得られた実行ファイルHelloは、通常の実行ファイルと何ら変わるところなく実行できます.

% ./Hello Hello World!

GCJの主なコマンドは、コンパイラであるgcjとインタプリタであるgij、この2つです. gcjコマンドはJava版gccコマンドだと考えてかまいません. Cコンパイラgccと同様のコマンドラインオプション、例えば-Oや-o、-c、-l、 -Wなどのオプションを受け付けます. -cオプションを指定してオブジェクトファイル(.o)を生成し、それらをリンクする、というように、 C/C++プログラムと同じようにJavaプログラムを扱うことができます.

gcj固有のオプションには、次のものがあります.

* --main=クラス名 * -C * --classpath=パス * --encoding=文字エンコーディング * -Dプロパティ名=値

--mainオプションは、実行ファイルを作成する際に与える必要があります. プログラムの実行開始地点であるmainメソッドを含むクラスの名前を指定します. -Cオプションを指定すると、gcjはネイティブコードの代わりにクラスファイルを生成します. つまり、JDKのjavacコマンドと同じ働きをします.

oogasawa@glowlight:~$ time java Random01 > /dev/null

real   0m56.342s user   0m51.063s sys    0m5.820s

oogasawa@glowlight:~$ time ./Random01 > /dev/null

real   1m54.966s user   1m24.453s sys    0m5.724s ますます遅い！

Perl

 * Math::Random::MT::Autoは乱数のseedを自動的に発生してくれる.
 * Normally, the standalone PRNG is automatically seeded when the module is loaded.
 * seedの発生方法は以下の順で試される.
 * /dev/urandom : Hardware random number generator
 * /dev/random : Hardware random number generator
 * random.org  : True Random Number Service on the internet

C
GNU Scientific Libraryにいろいろな乱数発生アルゴリズムが実装されている.
 * http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Generator-Examples.html

Build the program.

Run the program.
 * 速い！

print文をなくした場合