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の実行環境としてこれからが期待できそう。
*1 既存のバッチをちょっと修正すればOK