2007-03-30 (Fri) [長年日記]

JRuby 0.9.8を使ってみる

JRubyが 0.9.8になって以前より完成度があがったっぽい。

注目したいのはJRubyCを使ってASTをコンパイルし、Javaバイトコードにしてから実行や、YARVバイトコードの実行をサポートとか(どちらもexprimental)。

Windowsで実行する場合、JRubyCでコンパイルするためのバッチが無かったりJavaVMのオプションを渡すことができなかったりするので、ちょっと追加修正が必要*1です。

こちらを参考にsample/fib.rbをコンパイルして実行みる。

 $ jrubyc.bat samples/fib.rb

 $ ls -la samples/fib.*
 -rwx------+ 1 2603 Mar 30 16:41 samples/fib.class*
 -rwx------+ 1  128 Mar  6 08:43 samples/fib.rb*
 $ java -cp 'lib/jruby.jar;lib/asm-2.2.3.jar;lib/asm-commons-2.2.3;samples' fib
 6765

参考のblogよりCLASSPATHに指定するライブラリが増えてるので注意。

JRubyCは、なんでもコンパイルできるわけじゃなくて、むしろコンパイルできないRubyコードのほうが多い。今後に期待。

 $ jrubyc.bat samples/beer.rb
 Error -- Not compileable: Can't compile node: DStrNode[]: {EvStrNode[], StrNode[], EvStrNode[], StrNode[]}

繰り返し実行するメソッドのJust-In-Timeコンパイルも対応しているようなので試してみた。

 $ JAVA_OPTS='-Djruby.jit.enabled=true -server' jruby.bat fib_ruby.rb
 compiled: Object.fib_ruby
 Exception in thread "main" java.lang.NullPointerException
       at fib_ruby12839401.__file__(fib_ruby.rb:3)
       at fib_ruby12839401.run(fib_ruby.rb)
       at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:109)
       at org.jruby.RubyObject.callMethod(RubyObject.java:487)
       at org.jruby.RubyObject.callMethod(RubyObject.java:395)
  ....

こっちはぬるぽで動作せず。環境は、WindowsXP+JDK 1.6.0-b105+P4(HT)なり。

スレッドのベンチマークを実行してみると、コンパイルしなくてもCRubyよりJRubyのほうがかなり高速になった。JavaVMのNative Threadのお陰か。

CRuby JRuby
20.94sec 7.53sec

以下箇条書きまとめ。

  • GCは-serverにしたほうが良い結果を出す傾向がある。
  • コンパイルしない場合、基本的な演算やデータアクセスに関してはCRubyより3〜4倍遅いみたい。
  • 巨大な整数(BicNum)を使う演算はJRubyのが速い。

JRubyが得意な部分を生かすように使えれば、バイトコード実行に対応したRuby1.8.5の実行環境としてこれからが期待できそう。

Tags: Ruby Java JRuby

*1 既存のバッチをちょっと修正すればOK