У нас есть требование, когда нам нужно выполнить несколько коротких фрагментов JavaScript через Java.Для этого мы используем движок Nashorn, который поставляется вместе с Java.Версия Java - 1.8.0_191.
Мы инициализируем обработчик сценариев только один раз в жизненном цикле программы.Затем мы предварительно компилируем фрагменты (как они будут повторяться) в кеше.Мы используем предварительно скомпилированные скрипты для eval.Привязки будут отличаться каждый раз, и они создаются перед каждым выполнением.
Ниже приведен фрагмент.
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 выполнений в минуту.Как ускорить казни?