ほげにっき

hogedigoの日記

続javase6 scripting

javascriptやっぱり遅いなー、Rhinoバイトコードコンパイルすれば早くなるかな・・・などと思索していたら、javase6のscriptingにjavax.script.Compilableなるインターフェースがあることを知った。

まずはコンパイルしないパターン

ScriptEngine engine = 
	new ScriptEngineManager().getEngineByName("js");

engine.eval("function hoge(i) {return i % 100 == 0;}");

Date start = new Date();
for (int i = 0; i < 100000; i++) {
	if (Boolean.TRUE.equals(
			((Invocable)engine).invokeFunction("hoge", i))) {
		//System.out.println("###"+i);
	}
}
System.out.println(new Date().getTime() - start.getTime());

32203ms。

次にコンパイルする。evalの1行を↓に変更。

CompiledScript script =
	((Compilable)engine).compile(
		"function hoge(i) {return i % 100 == 0;}");
script.eval();

これでいいのかな?
実行すると31047ms。うーん。確かに短縮されたけど、これは誤差の範囲で実際は全然早くなってないと見た。。。


調べると、どうもcompileてのはjavaバイトコードコンパイルする、て意味じゃなくて、scriptの評価を再利用する為のものらしい(evalを何回も呼ぶケースで早くなるってことかな)。てことは、上記の様にfunction定義だけのscriptを一度evalするケースだと、意味がないってことかしら。


うーん。イマヒトツ。