Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

フィボナッチでRubyのバージョン毎にベンチマーク

フィボナッチで各種言語をベンチマーク - satosystemsの日記」を見て、Rubyの各バージョン(1.8.7, 1.9.3, 2.0.0dev)での速度の違いを測ってみました。

  • fib.rb
def fib(n)
    return n if (n < 2)
    return fib(n - 2) + fib(n - 1)
end

puts fib(38)
  • 1.8.7
$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin11.0]
$ time ruby fib.rb
39088169

real	1m24.281s
user	1m23.033s
sys	0m0.324s
  • 1.9.3
$ ruby -v
ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin11.4.2]
$ time ruby fib.rb
39088169

real	0m19.173s
user	0m18.974s
sys	0m0.170s
  • 2.0.0dev
$ ruby -v
ruby 2.0.0dev (2012-11-01 trunk 37411) [x86_64-darwin11.4.2]
$ time ruby fib.rb
39088169

real	0m11.566s
user	0m11.372s
sys	0m0.168s

番外編

Rubyに限った話ではないですが、メモ化を使うとかなり速くなります。

  • fib_memo.rb
def fib(n)
  @fib ||= Hash.new do |hash, key|
    if key < 2
      key
    else
      hash[key] = hash[key-1] + hash[key-2]
    end
  end
  @fib[n]
end

puts fib(38)
  • 結果
$ ruby -v
ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin11.4.2]
$ time ruby fib_memo.rb
39088169

real	0m0.271s
user	0m0.099s
sys	0m0.162s

まとめ

バージョン 速度
1.8.7 1m24.281s
1.9.3p286 0m19.173s
2.0.0dev 0m11.566s
1.9.3p286+メモ化 0m0.271s

バージョンが上がる毎に、実行速度が向上している。