Как улучшить производительность двигателя JDK 8 nashorn? - PullRequest
0 голосов
/ 20 февраля 2019

У нас есть требование, когда нам нужно выполнить несколько коротких фрагментов 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 выполнений в минуту.Как ускорить казни?

1 Ответ

0 голосов
/ 21 февраля 2019

Производительность значительно улучшилась при создании привязок только один раз в течение жизненного цикла программы.После каждого выполнения привязки необходимо очищать с помощью bindings.clear ()

...