続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するケースだと、意味がないってことかしら。
うーん。イマヒトツ。