Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java ScriptEngine(Groovy),如何使其性能更高?_Java_Groovy_Scriptengine - Fatal编程技术网

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

使用Java ScriptEngine(Groovy),如何使其性能更高?,java,groovy,scriptengine,Java,Groovy,Scriptengine,我在应用程序中使用ScriptEngine来评估应用程序中的一些客户端代码。 问题是执行不够,我需要采取措施来缩短执行时间。 目前,评估一个极其简单的脚本(基本上是URL中的参数替换)可能需要1463ms(平均约300ms) 我正在寻找一些简单的策略来提高性能,同时又不丧失脚本编写能力 我的第一个想法是将ScriptEngine对象合并并重用它。我在规范中看到它是要被重用的,但我还没有发现任何人真正这样做的例子 有什么想法吗? 这是我的密码: ScriptEngineManager factor

我在应用程序中使用ScriptEngine来评估应用程序中的一些客户端代码。 问题是执行不够,我需要采取措施来缩短执行时间。 目前,评估一个极其简单的脚本(基本上是URL中的参数替换)可能需要1463ms(平均约300ms)

我正在寻找一些简单的策略来提高性能,同时又不丧失脚本编写能力

我的第一个想法是将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()时,引擎实际上都会对脚本求值。相反,您可以通过接口重用预编译脚本

    // 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()方法