java groovy invokedynamic

java - ¿Cuánto le va a hacer a JSR-292(invookedynamic) con el rendimiento de Groovy?



invokedynamic (4)

No creo que haya un punto de referencia todavía, y hasta que alguien lo realice solo podemos adivinar ...

Puede encontrar esta publicación interesante en este tema.

¿Hay alguna estimación que indique cuánto afectará JSR-292 al rendimiento de Groovy?


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:

  • Capture la excepción que se lanza 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 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.


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, use @CompileStatic en Groovy 2.0.