使用Java ScriptEngine(Groovy),如何使其更高效?

我在我的应用程序中使用ScriptEngine来评估我的应用程序中的一些客户端代码。 问题是它不够高效,我需要采取措施来改善执行时间。 目前,最多可能需要1463毫秒(平均约300毫秒)来评估一个非常简单的脚本,这个脚本基本上是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); 

对于任何反馈,我们都表示感谢!

最有可能的问题是每次调用eval()时引擎实际上都会对脚本进行评估。 相反,您可以通过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,你也可以实现文件时间戳检查,如果脚本被更改,再次调用compile(..)。