2012-08-31 25 views
10

Sto utilizzando ScriptEngine nella mia app per valutare alcuni codici client nella mia applicazione. Il problema è che non è abbastanza performante e ho bisogno di prendere misure per migliorare il tempo di esecuzione. Attualmente, possono essere necessari fino a 1463 ms (la media è di circa 300 ms) per valutare uno script estremamente semplice, che in pratica è la sostituzione dei parametri negli URL.Con Java ScriptEngine (Groovy), come renderlo più performante?

Sto cercando strategie semplici per migliorare questa prestazione senza perdere la capacità di scripting.

Il mio primo pensiero è stato quello di raggruppare l'oggetto ScriptEngine e riutilizzarlo. Vedo nelle specifiche che è destinato a essere riutilizzato ma non ho trovato alcun esempio di qualcuno che lo faccia effettivamente.

Qualche idea? Ecco il mio codice:

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); 

Qualsiasi commento sarebbe apprezzato!

risposta

12

Molto probabilmente il problema è che il motore valuta effettivamente lo script ogni volta che viene chiamato eval(). Invece, è possibile riutilizzare lo script precompilato tramite l'interfaccia 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, è anche possibile implementare il controllo del file timestamp, se lo script è in fase di compilazione chiamata cambiato (..) di nuovo.

+0

Oh, questa è una grande idea! Sono andato avanti e ho riunito lo ScriptEngine con il pool di comuni. Ora vado avanti e precompilo. Grazie! – matsientst