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()のほうが簡単みたいだね。