JRuby vs CRuby

Debian etch, Athlon 64 X2 4400+ で試してみた。

% ruby -v
ruby 1.8.6 (2007-06-07 patchlevel 36) [x86_64-linux]

% java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0-b105, mixed mode)

fib.rb

st = Time.new

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

print(fib(30), "\n")
en = Time.new
puts (en - st)

fib2.rb

def fib(n)
  if n == 0 then
    0
  elsif n == 1 then
    1
  else
    fib(n-1) + fib(n-2)
  end
end

puts RUBY_VERSION
s = Time.new
p fib(30)
p Time.new - s
% time ruby fib.rb
832040
1.695624
ruby fib.rb  1.69s user 0.00s system 99% cpu 1.709 total
% time ./bin/jruby -J-server fib.rb
832040
2.609
bin/jruby -J-server fib.rb  4.54s user 0.34s system 129% cpu 3.759 total
% time ruby fib2.rb
1.8.6
832040
2.038708
ruby fib2.rb  2.03s user 0.01s system 99% cpu 2.053 total
% time ./bin/jruby -J-server fib2.rb
1.8.5
832040
3.249
./bin/jruby -J-server fib2.rb  4.71s user 0.30s system 112% cpu 4.440 total

ふーむ。Mac OS X 10.4, Dual Core Xeon だとどうか。

% ruby -v
ruby 1.8.6 (2007-06-07 patchlevel 36) [i686-darwin8.8.4]

% java -server -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-113)
Java HotSpot(TM) Server VM (build 1.5.0_06-68, mixed mode)
% time ruby fib.rb
832040
1.143365
ruby fib.rb  1.15s user 0.00s system 99% cpu 1.155 total
% time ./bin/jruby -J-server fib.rb
832040
1.6380000000000001
./bin/jruby -J-server fib.rb  3.17s user 0.17s system 137% cpu 2.424 total
% time ruby fib2.rb
1.8.6
832040
1.418115
ruby fib2.rb  1.42s user 0.00s system 99% cpu 1.430 total
% time ./bin/jruby -J-server fib2.rb
1.8.5
832040
2.2960000000000003
./bin/jruby -J-server fib2.rb  3.48s user 0.13s system 108% cpu 3.321 total

うーん。どのケースにおいても、JRuby のほうが遅いなぁ。
Windows の CRuby はコンパイラの最適化がひどくて性能が出てないとかそういう話かもなぁ。