2012-08-31 22 views
10

Estoy usando ScriptEngine en mi aplicación para evaluar algún código de cliente en mi aplicación. El problema es que no es lo suficientemente eficiente y necesito tomar medidas para mejorar el tiempo de ejecución. Actualmente, puede tomar hasta 1463ms (el promedio es de alrededor de 300ms) para evaluar un script extremadamente simple que es básicamente un reemplazo de parámetros en las URL.Con Java ScriptEngine (Groovy), ¿cómo hacerlo más eficiente?

Estoy buscando estrategias simples para mejorar este rendimiento sin perder la capacidad de scripting.

Mi primer pensamiento fue agrupar el objeto ScriptEngine y reutilizarlo. Veo en la especificación que está destinado a ser reutilizado, pero no he encontrado ningún ejemplo de alguien que realmente lo esté haciendo.

¿Alguna idea? Aquí está mi código:

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

sería apreciada Cualquier comentario!

Respuesta

12

Lo más probable es que el motor realmente evalúe el script cada vez que se llame a eval(). En su lugar, podría volver a utilizar el script precompilado a través de la interfaz 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, también se puede implementar la comprobación del archivo de marca de tiempo, si el guión es de compilación llamada cambiada (..) de nuevo.

+0

¡Oh, esa es una gran idea! He seguido adelante y he agrupado el ScriptEngine con un fondo común. Ahora seguiré y precompilaré. ¡Gracias! – matsientst

Cuestiones relacionadas