Parrot の課題が明らかに

前々日に示した PIR のプログラムでは、全ての変数を仮想レジスタで扱っています。PIR は通常の変数も使用できますが、あえて仮想レジスタで全てを扱ったのは演算速度が速くなるのを期待していたのです。

ところが、実際には Java/JRE に比べて全く遅い。

これは、Parrot-1.0.0 ではまだ、仮想レジスタが実CPUのレジスタに対応付けられていないからだと想像できます。Parrot-VM の特徴である仮想レジスタ。Parrot2までに、この特徴を生かす道が開かれるのか。課題が絞られてきたように思います。

四則演算の速度

前日のプログラムでは、sin 関数が律速となる可能性がありました(特にCとJava)。四則演算だけにするために、被積分関数を x^3 にして計算時間を比較しました。ループ関数は同じく1億回です。

言語 時間(秒)
C 1.119 1
Perl 181.9 162
PHP 94.71 84.6
Java 1.359 1.21
PIR 15.39 13.8

PIRJava に比べて、極端に遅くなりました。前日の例では、JavaPIR は1.4倍程度の差、今回は10倍以上となりました。

背景が見えてきました。前日の段階では PIRJava の差は数値関数の実装の違いだと思っていたのですが、実際には全く逆で、汎用演算の差が見えていたのでした。Java の場合は、sin 関数が律速していたのですが、PIR の場合は汎用演算そのものが律速となっていたようです。