Pourquoi Java 8 lambdas appelée à l'aide de invokedynamic?

La invokedynamic instruction est utilisé pour aider à la VM de déterminer la méthode de référence au moment de l'exécution au lieu de brancher au moment de la compilation.

C'est utile avec des langages dynamiques où la méthode exacte et les types d'argument ne sont pas connus jusqu'à l'exécution. Mais ce n'est pas le cas avec les lambdas de Java. Ils sont convertis en statique méthode bien définie arguments. Et cette méthode peut être appelée à l'aide de invokestatic.

Alors, quelle est la nécessité de invokedynamic pour les lambdas, surtout quand il y a un gain de performance?

  • Brian Goetz l'explique ici: wiki.jvmlangsummit.com/images/1/1e/2011_Goetz_Lambda.pdf
  • invokedynamic est pas utilisé pour appeler lambda, mais pour créer et lier un MethodHandle pour lambda du corps au site d'appel.
  • Indy est utilisée pour capturer l'lambda, pas l'invoquer.
  • Nous utilisons invokedynamic parce qu'il fournit à une amélioration de la performance, pas de dégradation des performances, sur le "évident" de la traduction des schémas. (Je ne sais pas d'où vous est venue l'idée qu'il y aurait un gain de performance, mais c'est incorrect.)
  • Il y a de test de performance stackoverflow.com/questions/19001241/...: "La ligne de fond est que le post compilation JIT, lambdas et anonyme classes effectuent de la même manière sur l'actuel Hostpot JVM implémentations".
  • les lambdas ne sont pas traduits à des méthodes statiques.
  • De référence?