Squeak Smalltalk 指向の Ruby VM、Rubinius でフィボナッチベンチ
Cygwin でビルドできねーできねーってあれやこれや試してすっかり時間を無駄にしてしまっていた Rubinius ですが(Win にはまだ対応していないってドキュメントをまず読めよ…→俺 orz)、OS X であっさりビルドできましたので、とりあえずお約束のフィボナッチベンチ。Rubinius、健闘していますね。
なお、Rubinius が Matz Ruby よりちょっと高速な(そして、YARV よりは遅い(^_^;))だけの Ruby 処理系…というわけではないという話は、次の id:sumim:20080214#p1 に。
Rubinius0.8 vs Ruby1.8 vs Ruby1.9
$ cat fib32p.rb def fib(n) n < 2 ? n : fib(n-1) + fib(n-2) end 32.times{ |i| p "n=#{i} => #{fib(i)}" }
$ rbx -v rubinius 0.8.0 (ruby 1.8.6 compatible) (a5b0f9aa1) (02/07/2008) [powerpc-apple-darwin8.11.0] $ time rbx fib32p.rb real 0m13.507s user 0m9.142s sys 0m0.309s
$ ruby -v ruby 1.8.6 (2007-09-23 patchlevel 110) [powerpc-darwin8.11.0] $ time ruby fib32p.rb real 2m11.017s user 1m30.899s sys 0m0.950s
$ ruby1.9 -v ruby 1.9.0 (2008-01-08 revision 0) [powerpc-darwin8.11.0] $ time ruby1.9 fib32p.rb real 0m7.017s user 0m4.959s sys 0m0.059s
... vs GNU Smalltalk vs Squeak Smalltalk vs Cincom Smalltalk
$ cat fib32p.st !Integer methodsFor: 'mathematical functions'! fib ^self < 2 ifTrue: [self] ifFalse: [(self - 2) fib + (self - 1) fib]! ! Time millisecondsToRun: [ 0 to: 31 do: [:i | Transcript cr; show: 'n=', i printString, ' => ', i fib printString] ]
$ gst -v GNU Smalltalk version 3.0 $ time gst fib32p.st real 0m6.222s user 0m3.710s sys 0m0.088s
"Squeak3.9 Smalltalk" FileStream fileIn: 'fib32p.st'. "=> 7944 " Time millisecondsToRun: [ 0 to: 31 do: [:i | "Transcript cr; show:" 'n=', i printString, ' => ', i fib printString] ] "=> 4281 "
"Cincom Smalltalk (VisualWorks 7.4NC)" 'fib32p.st' asFilename fileIn. "=> 1609 " Time millisecondsToRun: [ 0 to: 31 do: [:i | "Transcript cr; show:" 'n=', i printString, ' => ', i fib printString] ] "=> 592 "
Squeak Smalltalk と Cincom Smalltalk では、標準出力代わりのトランスクリプト出力のコストが無視できないのでコメントアウトしたのも測定しました。