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

问题描述 投票:0回答:1

我们需要通过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次。我们如何加快处决?

java nashorn
1个回答
0
投票

在程序生命周期中仅在创建绑定一次时,性能得到了极大的改善。每次执行后,需要使用bindings.clear()清除绑定

© www.soinside.com 2019 - 2024. All rights reserved.