我们有一个要求,我们需要通过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次执行。 我们如何加快执行速度?
答案 0 :(得分:0)
在程序生命周期中仅创建一次绑定的性能大大提高。每次执行后,都需要使用 bindings.clear()
清除绑定