12

我在我的应用程序中使用 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);

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

4

1 回答 1

12

最有可能的问题是引擎实际上每次调用 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(..)。

于 2012-08-31T20:02:15.273 回答