Différence de performances entre Java 8 et classes internes anonymes

Avant Java 8, la fonctionnalité lambda pouvait être obtenue en utilisant des classes internes anonymes. Par exemple:

interface Lambda { void doStuff(); } // ... public void doWithCallback(Lambda callback) { // ... callback.doStuff(); } // ... doWithCallback(new Lambda { public void doStuff() { // ... } }); 

En termes de performances, existe-t-il une différence entre utiliser encore cette approche et utiliser les nouveaux lambdas Java 8?

Oracle a publié une étude comparant les performances entre Lambdas et les classes anonymes

Voir JDK 8: Étude de la performance lambda par Sergey Kuksenko, soit 74 diapositives.

Récapitulatif: lent à se réchauffer mais quand JIT insère le pire des cas aussi rapidement que les cours anonymes mais peut être plus rapide.

Comme je l’ai constaté, le réseau itératif avec Stream fonctionne beaucoup plus lentement (74 diapositives ne sont pas considérées comme telles). Je pense que ce ne sont pas les seules fuites de performance dans les lambdas (devinez, elles seront améliorées dans le futur). L’exemple ci-dessous s’exécutait avec Java 8 sans aucune option:

  //Language is an enum Language[] array = Language.values(); System.err.println(array.length); // 72 items long t = System.nanoTime(); for (Language l : array) System.out.println(l.getLanguageName()); System.err.println(System.nanoTime()-t); //nano time 1864724 t = System.nanoTime(); Arrays.stream(array).forEach(v -> System.out.println(v.getLanguageName())); System.err.println(System.nanoTime()-t); //nano time 55812625 (55812625/1864724 = 29.93 times longer) List list = Arrays.asList(array); t = System.nanoTime(); for (Language l : list) System.out.println(l.getLanguageName()); System.err.println(System.nanoTime()-t); //nano time 1435008 t = System.nanoTime(); list.forEach(v -> System.out.println(v.getLanguageName())); System.err.println(System.nanoTime()-t); //nano time 1619973 (1619973/1435008 = 1.128 times longer)