2010-01-06 15 views
9

¿Hay una estimación que indique cuánto afectará JSR-292 al rendimiento de Groovy?¿Cuánto le hará JSR-292 (invookedynamic) al rendimiento de Groovy?

+0

Parece que todavía hay un largo camino por recorrer para obtener el código Groovy para obtener cierto beneficio de rendimiento de invocada dinámica. Mi algoritmo genético se realizó 5 veces más lento con invookedynamic habilitado, ¡y lo probé con Java 1.8.0 y Groovy 2.2.1! Puede intentarlo usted mismo, solo clone esto: https://github.com/renatoathaydes/MachineLearning y ejecute la prueba 'com.athaydes.ml.algorithms.LinearGPTest :: testNonTrivialPrograms'. Funciona en 4 segundos normalmente, pero con groovy-indy e invookedynamic, se ejecuta en al menos 25 segundos. – Renato

+0

Otra publicación que también mostró Indy realmente puede ralentizar su código de Groovy: http://derjan.io/blog/2012/08/08/first-steps-with-groovys-invokedynamic-support/ – Renato

Respuesta

4

invokedynamic es realmente una historia complicada, ya que las características de rendimiento cambian todo el tiempo en JDK7. Durante la migración de Groovy a indy llegué realmente, muy cerca de Java, al factor 1.5. Pero tengo que usar catchExceptionGuard, que reduce el rendimiento a algo así como ser factor 3-4. Todavía tenemos que investigar formas de evitar tener que usar ese guardia. Quizás tendremos que romper algún código existente en Groovy 2.2 para eso. De todos modos, no necesito el protector para invokeMethod fallback como se mencionó anteriormente. Es para GroovyRuntimeExceptions que posiblemente contenga otras excepciones, que tengo que desenvolver o hacer otras cosas. Entonces, el rendimiento teórico posible parece ser entre Java y la mitad de la velocidad de Java para los métodos existentes. La realización de llamadas a invokeMethod es una historia completamente diferente.

Si necesita más, utilice @CompileStatic en Groovy 2.0.

3

No creo que hay un punto de referencia, sin embargo, y hasta que alguien lo realiza sólo podemos adivinar ...

Usted puede encontrar this post en este asunto interesante.

2

Sería alrededor de 10-50 veces más rápido en general.

http://www.mail-archive.com/[email protected]/msg00819.html

+1

¿Puede respaldar eso? con algunas referencias o evidencia? –

+0

Hola, He agregado el enlace. Se basa en mi propia experiencia de crear un compilador Groovy sobre JSR-292. Y básicamente, es una estimación (ya que la pregunta también ha pedido la estimación;) – chanwit

+1

Realmente engañoso. De hecho, tengo una ralentización de 5x con indy habilitado. – Renato

0

No estoy seguro de cuánto es aplicable a Groovy. Si recuerdo bien, Groovy tiene algunos inconvenientes (por ejemplo, el método invokeMethod). No es posible usar simplemente el respaldo con invokedynamic, creo.

Sin embargo, hay algunas maneras:

  • detectar la excepción que se inicia cuando no se encuentra el método. Desafortunadamente, probablemente sea necesario analizar stacktrace, porque no puede estar seguro de dónde se arroja. Esto puede ser una ralentización significativa cuando se llama a un método no existente, independientemente de que sea manejado por invokeMethod callback.
  • Mira a Groovy ++. Le permite usar tipeo estático si satisface algunas restricciones. En tal caso, puede ser posible permitirle cambiar a un "modo dinámico estricto", que no permite estos retrocesos.
Cuestiones relacionadas