Mac の JDK は性能が出ないってことかなあ?
先方へのコメントには test/fib.rb って書いたんですが、 samples には fib.rb というファイルは(私のアーカイブには)なかったのでカンチガイでした。とまれ、この test/fib.rb というプログラムを実行させてみました。その前に簡単に説明すると、 test/fib.rb では、再帰ではなく逐次的計算でフィボナッチ数を計算しています。でも通常のループではなく末尾再帰的に計算しているため、そのうちスタックが溢れてしまうと。じゃ、どれくらいのデカい引数ならスタックが溢れますか、というのを SystemStackError で検知して、二分探索的に調べるとまあ、そういうプログラムのようです。
% bin/jruby test/fib.rb Estimating max fib recursion. This will be slightly lower than actual. good: 1 good: 2 good: 4 (snip) bad: 14849 17.675000 0.000000 17.675000 ( 17.617000) % ruby test/fib.rb Estimating max fib recursion. This will be slightly lower than actual. good: 1 good: 2 good: 4 (snip) good: 6391 0.370000 0.020000 0.390000 ( 0.397956) % /usr/local/ruby-1.9/bin/ruby19 test/fib.rb Estimating max fib recursion. This will be slightly lower than actual. good: 1 good: 2 good: 4 (snip) good: 6225 0.160000 0.010000 0.170000 ( 0.166586)
ガーン、スタックの大きさが違う。
この fib.rb というのは、フィボナッチ数を(再帰的ではなく繰り返しによって)計算しますが、再帰しているので巨大な場合はスタックを食い潰す、ということでどれくらい深く再帰できるかを二分探索的に調べている方式です。あれっ、 ruby1.9 って末尾再帰の最適化をしていないのかな?
まあいいや。
そういうわけでやっぱり JRuby が猛烈に遅いのですね。 JDK のせいなのかなあ。
ほかにも test/bench の下にフィボナッチ数の計算を逐次的にやる版や再帰的にやる版のベンチマークもありました。これも JRuby の方が若干遅いのですが、面白いことに逐次的計算の場合、 ruby 1.8.6 と ruby 1.9.0 は大差ない性能になっていました。
ところで前回、結論めいたことを書こうかどうしようか迷ったのですが、そうしているうちに keisuken さんに書かれてしまいました。実はわたしも、パフォーマンスには大した問題はないと思っています。いや、少し違うかな、速いならそれにこしたことはないのですが、ほかにも重要なことっていっぱいあるでしょう。というか、 Ruby は(Rubyistは)これまで散々遅い遅いと揶揄されてきていて、そこで「それよりももっと重要なことがある」という開き直りをしてきたわけです。自分より遅い処理系が出てきたからといって態度を変えるべきではない。
JRuby には JRuby のメリットがあるわけで、きちんとそういう点を評価をするべきではないかなーと思います。べつに遅くったっていいでしょう。でも国内のメディアでは「本家Rubyよりも速い」という触れ込みが効いている気がするんですよね。上みたいな極端な速度差はともかく、実際には大差ないんじゃないかと思うのだけど、どうなのかなあと。
ところで、マイコミジャーナルのOpenOffice のマクロを groovy で書くという記事を読んだら「誰か JRuby でもやってくんないかなー」と思ったり(他力本願)。