С 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 снова скомпилирован вызов компиляции (..).