【发布时间】:2015-02-14 03:27:51
【问题描述】:
我正在使用 Nashorn 实现一些对性能敏感的代码。我是这样做的:
private ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(new String[] { "--no-java" });
String someExpression = "someFunction() + someVariable";
// this compiled script gets cached, caching code omitted
CompiledScript script = ((Compilable)engine).compile(expr);
MyScriptContext context = new MyScriptContext();
Object output = script.eval(context);
在运行时,Nashorn 坚持对 MyScriptContext 进行大量必要的调用。它坚持在每次调用 eval() 时调用 MyScriptContext.getBindings().put("nashorn.global", anObject)。然后它调用 MyScriptContext.getAttribute("someVariable") (它应该调用)和调用 MyScriptContext.getAttribute("someFunction") (它不应该调用)。
它不应该调用“someFunction()”,因为该函数在编译时可用。 “someFunction()”需要编译为字节码并在编译时绑定,而不是每次调用 eval()。 eval() 处于紧密循环中。
如何说服 Nashorn 减少对 MyScriptContext 的调用?
【问题讨论】:
-
“我正在使用 Nashorn 实现一些对性能敏感的代码”你为什么要用脚本语言来实现对性能敏感的东西?
-
因为我必须这样做。这是一个基本的应用程序要求。是的,在这个应用程序的上下文中它是有意义的。