Ruby実装fib VS C拡張なRuby実装fib

C拡張とRuby実装でどのくらい違いがあるのか気になったのでfibでベンチマークをとってみました。

gem にしているので bundle install && bundle exec rake compile && cat fib.rb && bundle exec ruby fib.rb で実行できます。
https://github.com/jiikko/sandbox/tree/bd8f29a60af354f940744659989390c022593e71/ruby/gem/fib

C拡張Ruby実装

https://github.com/jiikko/sandbox/blob/bd8f29a60af354f940744659989390c022593e71/ruby/gem/fib/ext/fib/fib.c

int fib_internal(int n)
{
    if (n < 2) {
        return n;
    } else {
      return fib_internal(n-1)+fib_internal(n-2);
    }
}

Ruby実装

https://github.com/jiikko/sandbox/blob/bd8f29a60af354f940744659989390c022593e71/ruby/gem/fib/lib/fib.rb

module Fib
  def self.ruby(n)
  if(n < 2)
    return n
  else
    return ruby(n - 1) + ruby(n - 2)
  end
  end
end

結果

$ cat fib.rb
require 'benchmark'

Benchmark.bm do |r|
  r.report { Fib.c(40) }
  r.report { Fib.ruby(40) }
end
$ bundle exec ruby fib.rb
       user     system      total        real
   0.520000   0.000000   0.520000 (  0.523696)
  11.520000   0.020000  11.540000 ( 11.555269)

C拡張のほうが22倍早い。
Rubyは関数呼び出しが遅いらしいです。Cの世界で完結するとすごく早いですね。

謝辞

千葉さん(会社の人)から再帰処理についてご助言をいただきました。ありがとうございましたm(_ _)m