恒例のフィボナッチベンチで V8 と Smalltalk、Ruby、Python、Scheme とを戦わせてみる


爆速で話題の Google Chrome 搭載 JavaScript VM “V8” は、Animorphic Smalltalk VM がベースになっているらしい の続き。


その速いと言われる V8。実際、どのくらいの速度で動くのかを具体的な数値として見てみたくなったので、手軽に試すことができるフィボナッチベンチで、そのスコアを手元の処理系たちと並べて比較してみました。

環境は Modbook 2.4GHz Core 2 Duo(MacBook 相当)の Vista SP1 で、40番目のフィボナッチ数(63245986)の算出にかかった秒数をカウントしています。結果は次のようになりました。

言語 処理系 スコア [秒] 
JavaScript  Google Chrome (V8)      2.95
JavaScript  Firefox 3.01 (SpiderMonkey)     31.9
Smalltalk  Squeak Smalltalk 3.9     14.8
Smalltalk  Strongtalk 2.0      1.96
Smalltalk  Cincom Smalltalk (VisualWorks) 7.5      1.62
Ruby  Ruby 1.8    106
Ruby  Ruby 1.9     18.2
Python  Python 2.5     52.7
Scheme  Gauche 0.8     17.5


このベンチに限れば V8 は、元になった Strongtalk や商用 Smalltalk には一歩及ばないものの、それでも、よく知られた LL 言語たちよりはずっと高速に動作するように見えます。あなどれないですね。

使用したスクリプトと出力結果は以下に。


▼ JavaScript(Chrome、Firefox 共通。使用時は、全角!を半角に)

<script type="text/javascript"><!--
fib = function(n) { if (n < 2) { return n; } else { return fib(n-2) + fib(n-1); } }

n = 39;
start = new Date();
res = fib(n);
document.write(res, ", ", new Date() - start, " msec");
// --></script>
63245986, 2949 msec    // Chrome
63245986, 31936 msec   // Firefox

▼ Smalltalk(Squeak、Strongtalk、VisualWorks 共通)

Integer >> fib
    self < 2 ifTrue: [^self].
    ^(self-2) fib + (self-1) fib
39 fib   "=> 63245986 "
Time millisecondsToRun: [39 fib]
"Squeak      => 14797 "
"Strongtalk  =>  1958 "
"VisualWorks =>  1623 "

â–¼Ruby

$ cat fib.rb
class Integer
  def fib
    return self if self < 2
    (self-2).fib + (self-1).fib
  end
end

n = ARGV[0].to_i
start = Time.now
res = n.fib
puts res, (Time.now - start).to_s + " sec"
$ ruby -v fib.rb 39
ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-cygwin]
63245986
105.543 sec

$ ruby1.9 -v fib.rb 39
ruby 1.9.0 (2008-06-19 revision 17423) [i386-cygwin]
63245986
18.163 sec

â–¼Python

$ cat fib.py
import sys
import time

def fib(n):
  if n < 2:
    return n
  else:
    return fib(n-2) + fib(n-1)

n = int(sys.argv[1])
start = time.time()
res = fib(n)
print (res, time.time() - start)
$ python -V
Python 2.5.1
$ python fib.py 39
(63245986, 52.66700005531311)

â–¼Gauche

$ cat fib.scm
(use srfi-19)

(define (fib n)
  (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1)))))

(let*
  ((n (string->number (list-ref *argv* 0)))
   (start (current-time))
   (res (fib n)))
  (display (list res (time-difference (current-time) start))))
$ gosh -V
Gauche scheme interpreter, version 0.8.13 [utf-8,pthreads]
$ gosh fib.scm 39
(63245986 #<time-duration 17.474000000>)