Groovin' with Groovy

簡単なループのベンチマークJava 版Ruby 版 が載っていたので、早速手近なマシン(type U、1GHz)で、fact の引数を 100 に増やしたものを試してみました。

Java:   0.972 MicroSeconds per call
Ruby: 899     MicroSeconds per call

Java 、速すぎ(笑)。追記:この場合、BigInteger でないと駄目ですね。結果は 7.2 でそれでも十分速いですが…) ちなみに SqueakVisualWorks 3.1 でちょっとスクリプト言語スタイル(その場でメソッド定義…みたく)を意識した少々マニアックな Smalltalk コード(Squeak、VW3 共通)、

n time
SystemDictionary compile: 'fact: n (2 to: n) inject: 1 into: [: f : i | f * i]' classified: 'user defined'. n := 10000. time := (Time millisecondsToRun: [n timesRepeat: [Smalltalk fact: 100]]) asFloat / n. SystemDictionary removeSelector: #fact:. 'Smalltalk: ', (1000 * time) printString, ' MicroSeconds per call'

では、

Squeak: 340.7 MicroSeconds per call
VW3.1:  108.8 MicroSeconds per call

てなぐあいでした。Squeak VMRuby の 10 倍くらい、VisualWorks VM はさらにその 10 倍くらい速いかなぁ…となかば根拠レスに思っていたのですが、そうでもないんですね。Squeak でこのくらいの差なら、場合によっては Ruby に負けることもありそうです。同じような差でも SqueakVisualWorks に勝つことはなさそうですが(^_^;)。ってか、あんまし勝ってほしくないし。