如何提高JDK 8 nashorn引擎性能?

时间:2019-02-20 11:43:06

标签: java nashorn

我们有一个要求,我们需要通过Java执行几个简短的JavaScript代码段。为此,我们使用与Java一起嵌入的Nashorn引擎。 Java版本是1.8.0_191。

我们仅在程序的生命周期中初始化脚本引擎一次。然后我们在缓存中预编译代码片段(因为代码片段将重复)。我们使用预编译的脚本进行评估。每次绑定都是不同的,并且绑定是在每次执行之前创建的。

以下为摘要。

public class RuleExecutor {

    private ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
    private Map<String, CompiledScript> ruleCache = new HashMap<>();
    ..
    ....

    public Object execute(Rule rule) {
        Bindings bindings = engine.createBindings(); 
        bindings.put(....);
        compiled = ruleCache.get(rule.getTarget());
        if (compiled == null) {
            compiled = ((Compilable) engine).compile(rule.getExpr());
            ruleCache.put(rule.getTarget(), compiled);
        }
        compiled.eval(bindings);
        output = bindings.get(rule.getTarget());
        return output;
     }

规则表达式可以是任意的自包含脚本。但是它们重复,因此进行缓存。 通过以上操作,我们每分钟获得120000次执行。 我们如何加快执行速度?

1 个答案:

答案 0 :(得分:0)

在程序生命周期中仅创建一次绑定的性能大大提高。每次执行后,都需要使用 bindings.clear()

清除绑定