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 では、標準出力代わりのトランスクリプト出力のコストが無視できないのでコメントアウトしたのも測定しました。