JRuby は確かに速い。(というか、私の場合は -O -J-server を知らなかった...。)
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.rb は http://svgmapdata.sakura.ne.jp/geotools/ のものです。これを、MacBook の Mac 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 から使用するというものなのですが、
- CRuby + Rjb には、プリミティブ型と String 型の Ruby クラスへの変換をスキップできる選択肢があり、その場合には私の用途で2倍程度の処理時間短縮ができる場合があった(c.f. JRuby と CRuby + Rjb の速度の違いにはプリミティブ型クラス (+ String 型) の変換が関係している - Relevant, Timely, and Accurate)。
- しかし、JRuby の -O -J-server オプションを使うと、やはり2倍程度の処理時間短縮ができるようである。型変換のスキップはできないが、他の要素により処理時間短縮ができている。
- よって、CRuby + Rjb でなければ得られない処理時間圧縮要素がなくなった。
という三段論法により、これからは JRuby を本格的に利用することにしようと思います。