(ここからの続き)
たらいまわし関数こと、竹内関数ベンチもブロックで試せるようになりました。OQO の HDD 容量がひっ迫していて VisualWorks をインストールできていないので、Win は Strongtalk との比較です。最適化がうまく働くと VisualWorks は爆速です。コードは Ruby を除き(当然ですな…w)、全ての処理系で同じものを使用しました*1。なお、VisualWorks の 1 ms 以下の結果については、10 〜 10000 回の平均値をとって大幅な変動がないことを確認したうえでの平均値。
Squeak のクロージャは遅いといえば遅いのですが、これは Strongtalk (or VisualWorks) vs Squeak における単純な VM 性能比で、クロージャになることで極端に遅くなっているということもなさそうです。ついでに行なったプラットフォーム間比較の方は、PowerPC が健闘しているというか、Crusoe は腐っても 1Ghz というか、やはりもっさりなのか、微妙なところです。
ノーマル
tarai |
=> 37131 ... Squeak 3.7.1 / Win XP SP2 / Crusoe 1Ghz => 5181 ... Strongtalk 1.1.1 / Win XP SP2 / Crusoe 1Ghz => 37225 ... Squeak 3.8.6Beta2.app / Mac OS X / PowerPC 667Mhz => 46566 ... Squeak 3.7.5b1 Classic / Mac OS 9 / PowerPC 667Mhz => 7486 ... VisualWorks 7.2 / Mac OS 9 / PowerPC 667Mhz
クロージャ渡しで遅延評価もどき
tarai |
=> 23 ... Squeak 3.7.1 / Win XP SP2 / Crusoe 1Ghz => 4 ... Strongtalk 1.1.1 / Win XP SP2 / Crusoe 1Ghz => 11 ... Squeak 3.8.6Beta2.app / Mac OS X / PowerPC 667Mhz => 12 ... Squeak 3.7.5b1 Classic / Mac OS 9 / PowerPC 667Mhz => 0.2 ... VisualWorks 7.2 / Mac OS 9 / PowerPC 667Mhz
返値の評価の重複を省いて若干の効率化
tarai |
=> 10 ... Squeak 3.7.1 / Win XP SP2 / Crusoe 1Ghz => 1 ... Strongtalk 1.1.1 / Win XP SP2 / Crusoe 1Ghz => 4 ... Squeak 3.8.6Beta2.app / Mac OS X / PowerPC 667Mhz => 6 ... Squeak 3.7.5b1 Classic / Mac OS 9 / PowerPC 667Mhz => 0.03 ... VisualWorks 7.2 / Mac OS 9 / PowerPC 667Mhz
メソッド版
Tarai class >> x: xx y: yy z: zz xx <= yy ifTrue: [^ yy]. ^ Tarai x: (Tarai x: xx - 1 y: yy z: zz) y: (Tarai x: yy - 1 y: zz z: xx) z: (Tarai x: zz - 1 y: xx z: yy)
Time millisecondsToRun: [Tak x: 12 y: 6 z: 0]
=> 6877 ... Squeak 3.7.1 / Win XP SP2 / Crusoe 1Ghz => 830 ... Strongtalk 1.1.1 / Win XP SP2 / Crusoe 1Ghz => 7702 ... Squeak 3.8.6Beta2.app / Mac OS X / PowerPC 667Mhz => 10049 ... Squeak 3.7.5b1 Classic / Mac OS 9 / PowerPC 667Mhz => 983 ... VisualWorks 7.2 / Mac OS 9 / PowerPC 667Mhz
(参考)
=> 32206 ... Ruby 1.8.1 (2003-12-25) [i386-cygwin]
*1:Strongtalk での静的型チェックオプションは使用していません。