恒例のフィボナッチベンチで 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>)