我们需要通过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次。我们如何加快处决?
在程序生命周期中仅在创建绑定一次时,性能得到了极大的改善。每次执行后,需要使用bindings.clear()清除绑定