2012-08-31 3 views
10

Ich benutze ScriptEngine in meiner App, um einige Client-Code in meiner Anwendung zu bewerten. Das Problem ist, es ist nicht performant genug und ich muss Maßnahmen ergreifen, um die Ausführungszeit zu verbessern. Momentan kann es bis zu 1463ms dauern (der Durchschnitt liegt bei 300ms), um ein extrem einfaches Skript zu erstellen, das im Grunde genommen Parameteraustausch in URLs ist.Mit Java ScriptEngine (Groovy), um es leistungsfähiger zu machen?

Ich suche nach einfachen Strategien, um diese Leistung zu verbessern, ohne die Skriptfähigkeit zu verlieren.

Mein erster Gedanke, das ScriptEngine-Objekt zu poolen und es wiederzuverwenden. Ich sehe in der Spezifikation, dass es wiederverwendet werden soll, aber ich habe keine Beispiele dafür gefunden, dass irgendjemand es tatsächlich tut.

Irgendwelche Ideen? Hier ist mein Code:

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

Jedes Feedback würde geschätzt!

Antwort

12

Höchstwahrscheinlich ist das Problem, dass die Engine das Skript jedes Mal evaluiert, wenn eval() aufgerufen wird. Stattdessen können Sie das vorkompilierte Skript über die Schnittstelle Compilable erneut verwenden.

// 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, Sie können die Datei auch Zeitstempel zu überprüfen, implementieren, wenn das Skript erneut geänderten Aufruf der Kompilierung (..) ist.

+0

Oh, das ist eine großartige Idee! Ich bin voran gegangen und habe die ScriptEngine mit commons-pool gepoolt. Ich werde jetzt weitermachen und vorkompilieren. Vielen Dank! – matsientst

Verwandte Themen