JRubyに深刻なパフォーマンス問題?
JRubyでJSONを処理するプログラムを書いてテストしてみたところ、非常にパフォーマンスが悪い。今まで持っていた「JRubyは遅い」という認識を明らかに上回るレベルの遅さだったので、Rubyと比較検証してみました。
require 'rubygems' require 'json/pure' def json_bench(n) s = "{" for i in 1..n s << ", " if i > 1 s << "\"elem#{i}\" : \"foo\"" end s << "}" t = Time.now JSON.parse(s) puts "#{n} elements: #{Time.now - t} sec." end json_bench(500) json_bench(1000) json_bench(1500) json_bench(2000)
このプログラムをRubyとJRubyでそれぞれ実行すると、次のような結果になりました。
> ruby -v ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] > ruby test.rb 500 elements: 0.016 sec. 1000 elements: 0.047 sec. 1500 elements: 0.062 sec. 2000 elements: 0.078 sec. > jruby -v ruby 1.8.5 (2007-11-01 rev 4842) [x86-jruby1.1b1] > jruby -O test.rb 500 elements: 0.984 sec. 1000 elements: 3.375 sec. 1500 elements: 8.359 sec. 2000 elements: 16.079 sec.
うん、やっぱり遅すぎる。しかも処理時間がRubyでは線形増加するのに対して、JRubyではO(n^2)になっているように見えます。JRubyの基本クラス実装のどこかに問題があるんじゃないかなあ。今度、余裕があったらソースを追ってみようと思います。