かってにインパクトファクター

子育てサラリーマンが日々の雑多なことをつらつらと綴ってます。時々政治ネタ経済ネタコンピュータネタなどをはさみます。

rubyとjrubyをベンチマークで比較してみた。

最近は何かプログラムを組むとなると、rubyで組むことがほとんどなのです。なんせ非常に楽。慣れも大きいと思いますが、同じ動作をするように組むとrubyの方が他の言語とくらべてソースが短くなる気がするのです。

ただ、rubyにもひとつ欠点はあります。

それは、実行速度が遅いこと。

ただ、多くのプログラムでは、言語それ自体の遅さより、ネットワークだったり、ローカルのハードディスクへのアクセスだったりに多くの時間が取られてしまって、言語の遅さがそれほど目立たないんじゃないでしょうか。
例えば、言語の速度が10倍になったとしても、プログラム全体の速度でみると、10%くらいしか改善しないとか。

だったら、HDDを早いのに変えるとか、SSDに変えるとか、他で改善して、速度が遅くても生産性の高い言語を選ぶというのはひとつの解になります。


ところがですね。私が組むプログラムでは、比較的計算部分が多かったりします。
なので、Rubyでさくっと作っておいて、処理時間がかかる部分を集中的に改善するという使い方をしたいんです。
たとえば、エクセルマクロなんかでは、基本的に変数の型なんかを指定しなくても使えますが、型を指定すると速度が上がります。他にも、Excel自体の画面を更新しないとか、Excel自体の関数を利用するとか、テクニックはいろいろあるのはあります。

Rubyなんかでも、同じように局所的に型を指定することで自由度は下がるけど速度が上がるような使い方ができれば嬉しいんですが、その選択肢は今のところありません。

といって、Ruby自体を別の言語に変えてしまうのも結構しんどい。

特定のモジュールだけをC言語で組んで呼び出すか?でもWindowsだとその環境作るのめんどくさいよね?テスト環境はWindowsで本番環境がFreeBSDだってのも問題かもしれませんが。

前置きが長くなりましたが、java上で動作するRubyを使って基本プログラムを動かして、速度を上げたいところだけjavaで組んで呼び出すというのはある意味現実な選択肢ですよねということで、その前段階として、jrubyをインストールして、そのベンチマークを取ってみました。

今日は簡単に。

環境はさくらVPS メモリ1G です。OSは 9.1-RELEASE-p17 です。

ソースはここから拝借しました。
フィボナッチで各種言語をベンチマーク - satosystemsの日記

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

puts fib(38)

結果です。

% ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-freebsd9.1]
% time ruby fib.rb
39088169
ruby fib.rb 13.22s user 0.04s system 0% cpu 13.274 total
% rbenv local jruby-1.7.16
% ruby -v
jruby 1.7.16 (1.9.3p392) 2014-09-25 575b395 on OpenJDK 64-Bit Server VM 1.7.0_71-b14 +jit [FreeBSD-amd64]
% time ruby fib.rb
39088169
ruby fib.rb 11.82s user 1.68s system 0% cpu 9.601 total

ということで、jrubyコンパイルに時間がかかるという欠点は有りますが、現時点でもすでに10%以上高速なようです。

またこんど時間を見つけてもう少し細かく検証してみます(覚えてたらですが)。