groovy java-7 invokedynamic groovy-2 compile-static

¿Debo usar Groovy''s @CompileStatic si también estoy usando Java 7?



java-7 invokedynamic (2)

La versión indy es totalmente dinámica. Groovy, como es conocido, solo más rápido gracias a JDK 7 invookedynamic. @CompileStatic significa compilación estática. Aunque es más rápido que lo normal, Groovy solo puede compilar un subconjunto de Groovy y se comporta de forma un poco diferente. Especialmente todas las características dinámicas ya no están disponibles. Entonces, si desea usar funciones dinámicas, entonces indy es la única opción. Si va a ser un tipo estático y solo usará una pequeña parte del idioma, entonces se puede usar @CompileStatic.

Fibonacci por cierto no es una prueba en la que invookedynamic puede brillar. El puerto indy no siempre es mejor. Pero si haces mucho con la programación meta, entonces indy será mejor.

Tienes que decidir según tu uso al final

He leído el "Novedades de Groovy 2.0" y estoy un poco confundido sobre cuándo usar @CompileStatic. El artículo menciona que la anotación @CompileStatic se agregó para los desarrolladores que no pudieron aprovechar la parte dinámica de invocación de Java7.

Así que los desarrolladores que buscan mejoras de rendimiento no verán muchos cambios en Groovy 2.0, si no pueden ejecutar en JDK 7. Afortunadamente, el equipo de desarrollo de Groovy pensó que esos desarrolladores podrían obtener un aumento de rendimiento interesante, entre otras ventajas, al permitir el tipo revisado código que se compilará estáticamente

Mi pregunta es, si estoy usando JDK 7 y sigo las instrucciones para agregar el indicador --indy , ¿necesito agregar @CompileStatic para ver un aumento en el rendimiento? Este blog sugiere que lo haría, pero no estoy seguro de que compilara correctamente dado que lo hizo dentro de Eclipse.

Actualización: Aquí están las estadísticas cuando se ejecutan diferentes permutaciones del código de Fibonacci.

> groovy --indy FibBoth.groovy ..........Fib (non-static indy): 1994.465 ..........Fib (static indy): 529.197 > groovy FibBoth.groovy ..........Fib (non-static): 1212.788 ..........Fib (static): 525.671

Nota: esta pregunta parece un poco confusa ahora que entiendo que las características son independientes. Dado que la base de la pregunta está en torno a la confusión de las notas que me hicieron pensar que las dos características estaban relacionadas, creo que tiene sentido no cambiar la redacción de la pregunta y permitir la respuesta aceptada que explique las diferencias.


Para reducirlo, @CompileStatic elimina algunas funciones de tiempo de ejecución dinámico de Groovy a favor de la velocidad.

Entonces, teóricamente:

  • JDK7 debería ser más rápido que JDK6 debido a invookedynamic
  • @CompileStatic debe ser más rápido que el estándar porque se eliminan algunos gastos generales y características.

Todo eso con la advertencia de que dependerá en gran medida de lo que esté haciendo, ya que varias funciones están optimizadas en diferentes grados.