JRuby は確かに速い。(というか、私の場合は -O -J-server を知らなかった...。)

Joel 式

JRubyが遅いという話は過去のものになるかもしれません。

http://recompile.net/2007/10/trunkjruby.html

を拝見して、改めて私の用途についてベンチマークを取り直してみました。

ベンチマークの内容は、

99819 レコードある Shapefile ファイルを読み、読んだレコードをすべて別の Shapefile に書き出す。

というもので

require 'geotools'

src = '(...)/transl_1_1.shp'
start_time = Time.now
Geo::Writer.open('trans.shp') do |w|
  Geo::Reader.foreach(src) do |g, a|
    w.write(g, a)
  end
end
print "#{Time.now - start_time}s\n"

というものです。geotools.rbhttp://svgmapdata.sakura.ne.jp/geotools/ のものです。これを、MacBookMac OS X 上で time コマンドを使って時間計測しました。

結果

Ruby の種類 real user sys 起動時間除外 1レコードあたり処理時間
JRuby trunk 203.00s 189.98s 11.13s 195.49s 1.96ms
JRuby trunk -O -J-server 112.23s 110.36s 8.37s 104.23s 1.04ms
JRuby 1.0.1 190.04s 187.89s 10.96s 185.84s 1.86ms
JRuby 1.0.1 -O -J-server 128.04s 111.61s 8.64s 119.97s 1.20ms
Ruby 1.8.6 221.38s 197.51s 7.30s 218.67s 2.19ms

私の場合、

CRuby で同等の処理をするよりも速い
-O -J-server をつけると2倍速くなる

という結果になりました。しかも -O -J-server をつけたときの処理時間は、私が目標としていた 1ms 程度になってくれています。

私の用途の場合

私の用途は、Java ライブラリを Ruby から使用するというものなのですが、

という三段論法により、これからは JRuby を本格的に利用することにしようと思います。