有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

任何反馈都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    最有可能的问题是,每次调用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(..)再说一遍