我有一个很大的文件,需要经常对其进行评估,
我曾经用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的那不一样。
答案 0 :(得分:3)
要使用GraalVM重现ScriptEngine
设置,应在使用后重用相同的Engine
(org.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或优化的代码。