nashorn CompiledScript graalvm等效项

时间:2018-11-26 14:50:01

标签: graalvm

我有一个很大的文件,需要经常对其进行评估,

我曾经用nashorn做类似的事情:

CompiledScript compiledScript = ((Compilable) engine).compile(text);

随后,我可以多次拨打以下电话:

Context context = new SimpleScriptContext();
compiledScript.eval(context);

这非常快。

使用新的Polyglot API,我做到了:

Source source = Source.newBuilder("js", myFile).build();

然后:

Context context = Context.newBuilder("js").option("js.nashorn-compat", "true").build();
context.eval(source)

使用jmh,两者之间的性能差异很大

Benchmark                     Mode  Cnt   Score    Error  Units
JmhBenchmark.testEvalGraal    avgt    5  42,855 ± 11,118  ms/op
JmhBenchmark.testEvalNashorn  avgt    5   2,739 ±  1,101  ms/op

如果我在相同的上下文中执行eval,则它可以正常工作,但是我不想在两个连续的eval之间拥有共享的上下文(除非Graal Context的概念是与Nashorn的那不一样。

1 个答案:

答案 0 :(得分:3)

要使用GraalVM重现ScriptEngine设置,应在使用后重用相同的Engineorg.graalvm.polyglot.Engine)和.close()上下文:

Source source = Source.newBuilder("js", myFile).build();
Engine engine = Engine.create();

及更高版本:

Context context = Context.newBuilder("js")
                         .engine(engine)
                         .option("js.nashorn-compat", "true").build();
context.eval(source);
context.close();

引用Context.Builder.engine documentation

  

明确设置要使用的基础引擎。默认情况下,每个上下文都有其自己的隔离引擎。如果从一个引擎创建了多个上下文,则它们可以通过指定单个基础引擎来共享/缓存某些系统资源,例如AST或优化的代码。