JavaからJRubyの呼び出しについて
「JRubyのインスタンス生成で気をつけねばならんこと。」ということを書いてたんだけど、Rubyオブジェクトはシングルトンで〜なんてあまりに当たり前すぎてしょうもなかったから、書いていた日記を一旦消すことにして、Ruby.newInstance()を使った場合と、JavaEmbedUtils.initialize()を使った場合のオブジェクトで実行した場合のパフォーマンスの比較内容に書き変えました。
JRubyでevalする方法はRuby.newInstance()でrubyインスタンスをゲットして呼び出す方法とJavaEmbedUtils.initialize()してRubyRuntimeAdapter経由で呼び出す方法があるんだけど、べった書きのスクリプトを実行する場合はどっちがいいんだろう?と思ってとりあえずパフォーマンスだけ計測。
import java.util.ArrayList; import org.jruby.Ruby; import org.jruby.RubyRuntimeAdapter; import org.jruby.javasupport.JavaEmbedUtils; public class RubyTest { public RubyTest() { RubyTest1 test1 = new RubyTest1(); RubyTest2 test2 = new RubyTest2(); long start = System.currentTimeMillis(); test1.execute(1000); System.out.println("test1 Amount:" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); test2.execute(1000); System.out.println("test2 Amount:" + (System.currentTimeMillis() - start)); } public static void main(String[] args) { new RubyInstanceTest3(); } class RubyTest1{ private Ruby ruby; private RubyRuntimeAdapter adapter; public RubyTest1() { ruby = JavaEmbedUtils.initialize(new ArrayList<String>()); adapter = JavaEmbedUtils.newRuntimeAdapter(); } public void execute(int count) { for (int i = 0; i < count; i++) { adapter.eval(ruby, "(1 + 2) * 3"); } } } class RubyTest2{ private Ruby ruby; public RubyTest2() { ruby = Ruby.newInstance(); } public void execute(int count) { for (int i = 0; i < count; i++) { ruby.evalScriptlet("(1 + 2) * 3"); } } } }
実行結果
test1 Amount:3075 test2 Amount:2954
どちらでやっても、さほど変わんないみたい。
.rbファイルを呼び出したり、引数を与えて実行したいなんてしない限りは
Ruby.newInstance()のほうが簡単みたいだね。