利用Java的ScriptEngine(Groovy中),如何使它更好的性能?(With Java

2019-06-27 16:06发布

我在我的应用程序中使用的ScriptEngine来评价我的应用程序的一些客户端代码。 问题是,它没有足够的高性能和我需要采取措施提高执行的时间。 目前,它可能需要长达1463ms(平均大约是300毫秒),以EVAL一个非常简单的脚本,这基本上是在网址参数替代。

我在寻找简单的策略,而不会失去脚本能力提高这一性能。

我首先想到它汇集的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);

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

Answer 1:

最有可能的问题是,发动机实际评估脚本每一次的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,你还可以实现文件的时间戳检查,如果脚本改变调用编译(..)一次。



文章来源: With Java ScriptEngine (Groovy), how to make it more performant?