ClosureCompiler その3

ここからの続き)

たらいまわし関数こと、竹内関数ベンチもブロックで試せるようになりました。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
tarai := nil. tarai := [: xx : yy : zz | xx <= yy ifTrue: [yy] ifFalse: [ tarai value: (tarai value: xx - 1 value: yy value: zz) value: (tarai value: yy - 1 value: zz value: xx) value: (tarai value: zz - 1 value: xx value: yy)]]. Time millisecondsToRun: [tarai value: 12 value: 6 value: 0]
=> 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
tarai := nil. tarai := [: xBlock : yBlock : zBlock | xBlock value <= yBlock value ifTrue: [yBlock value] ifFalse: [ tarai value: [tarai value: [xBlock value - 1] value: yBlock value: zBlock] value: [tarai value: [yBlock value - 1] value: zBlock value: xBlock] value: [tarai value: [zBlock value - 1] value: xBlock value: yBlock]]]. Time millisecondsToRun: [tarai value: [12] value: [6] value: [0]]
=> 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
tarai := nil. tarai := [: xBlock : yBlock : zBlock | | yBlockValue | xBlock value <= (yBlockValue := yBlock value) ifTrue: [yBlockValue] ifFalse: [ tarai value: [tarai value: [xBlock value - 1] value: yBlock value: zBlock] value: [tarai value: [yBlockValue - 1] value: zBlock value: xBlock] value: [tarai value: [zBlock value - 1] value: xBlock value: yBlock]]]. Time millisecondsToRun: [tarai value: [12] value: [6] value: [0]]
=>  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 での静的型チェックオプションは使用していません。