2012-08-31 65 views
10

我在我的應用程序中使用ScriptEngine來評估我的應用程序中的一些客戶端代碼。 問題是它的性能不夠好,我需要採取措施來提高執行時間。 目前,它可能需要長達1463毫秒(平均300毫秒左右)來評估一個非常簡單的腳本,它基本上是URL中的參數替換。使用Java ScriptEngine(Groovy),如何使它更具性能?

我正在尋找簡單的策略來提高此性能而不會失去腳本功能。

我首先想到了將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); 

任何反饋,將不勝感激!

回答

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,你還可以實現文件的時間戳檢查,如果腳本改變調用編譯(..)一次。

+0

哦,這是一個好主意!我已經繼續前進,並將ScriptEngine與commons-pool混合使用。我現在繼續並進行預編譯。謝謝! – matsientst