使用Java ScriptEngine(Groovy),如何使其性能更高?
我在应用程序中使用ScriptEngine来评估应用程序中的一些客户端代码。 问题是执行不够,我需要采取措施来缩短执行时间。 目前,评估一个极其简单的脚本(基本上是URL中的参数替换)可能需要1463ms(平均约300ms) 我正在寻找一些简单的策略来提高性能,同时又不丧失脚本编写能力 我的第一个想法是将ScriptEngine对象合并并重用它。我在规范中看到它是要被重用的,但我还没有发现任何人真正这样做的例子 有什么想法吗? 这是我的密码:使用Java ScriptEngine(Groovy),如何使其性能更高?,java,groovy,scriptengine,Java,Groovy,Scriptengine,我在应用程序中使用ScriptEngine来评估应用程序中的一些客户端代码。 问题是执行不够,我需要采取措施来缩短执行时间。 目前,评估一个极其简单的脚本(基本上是URL中的参数替换)可能需要1463ms(平均约300ms) 我正在寻找一些简单的策略来提高性能,同时又不丧失脚本编写能力 我的第一个想法是将ScriptEngine对象合并并重用它。我在规范中看到它是要被重用的,但我还没有发现任何人真正这样做的例子 有什么想法吗? 这是我的密码: ScriptEngineManager factor
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);
任何反馈都将不胜感激 最有可能的问题是,每次调用eval()时,引擎实际上都会对脚本求值。相反,您可以通过接口重用预编译脚本
// 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,您还可以实现文件时间戳检查,如果脚本发生更改,请再次调用compile(..)。哦,这是一个好主意!我已经将ScriptEngine与commons池合并。我现在开始预编译。谢谢CompiledScript似乎不会对groovy产生任何影响,它只是调用engine.eval()方法