С Java ScriptEngine (Groovy), как сделать его более эффективным?

Я использую ScriptEngine в своем приложении для оценки кода клиента в своем приложении. Проблема в том, что он недостаточно эффективен, и мне нужно принять меры для улучшения времени исполнения. В настоящее время он может занимать до 1463 мс (в среднем около 300 мс), чтобы оценить чрезвычайно простой script, который в основном заменяет параметры в URL-адресах.

Я ищу простые стратегии для улучшения этой производительности, не теряя возможности сценариев.

Сначала я подумал, что он объединяет объект ScriptEngine и повторно его использует. Я вижу, что в спецификации это означает повторное использование, но я не нашел примеров того, кто на самом деле это делает.

Любые идеи? Вот мой код:

ScriptEngineManager factory = new ScriptEngineManager();
GroovyScriptEngineImpl engine = (GroovyScriptEngineImpl)factory.getEngineByName("groovy");
engine.put("state", state;
engine.put("zipcode", zip);
engine.put("url", locationAwareAd.getLocationData().getGeneratedUrl());
url = (String) engine.eval(urlGeneratorScript);

Любая обратная связь будет оценена!

Ответ 1

Скорее всего, проблема в том, что движок фактически оценивает script каждый раз, когда вызывается eval(). Вместо этого вы можете повторно использовать предварительно скомпилированный script через Compilable интерфейс.

    // move this into initialization part so that you do not call this every time.
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine  = manager.getEngineByName("groovy");
    CompiledScript script = ((Compilable) engine).compile(urlGeneratorScript);

    //the code below will use the precompiled script code
    Bindings bindings = new Bindings();
    bindings.put("state", state;
    bindings.put("zipcode", zip);
    bindings.put("url", locationAwareAd.getLocationData().getGeneratedUrl());
    url = script.eval(bindings);

FWIW, вы также можете выполнить проверку отметки времени файла, если script снова скомпилирован вызов компиляции (..).