Diferença de desempenho entre lambdas do Java 8 e classs internas anônimas

Antes do Java 8, a funcionalidade lambda poderia ser obtida usando classs internas anônimas. Por exemplo:

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

Em termos de desempenho, existe uma diferença entre ainda usar essa abordagem e usar os novos lambdas do Java 8?

Oracle publicou um estudo comparando desempenho entre Lambdas e classs anônimas

Veja JDK 8: Lambda Performance Study, de Sergey Kuksenko, com 74 slides.

Resumo: lento para aquecer, mas quando o JIT insere o pior cenário com a mesma rapidez que a class anônima, mas pode ser mais rápido.

Como eu encontrei, a iteração sobre o array com o Stream está funcionando muito mais devagar (74 slides não são considerados como o caso). Eu acho que não é o único vazamento de desempenho em lambdas (acho que será melhorado no futuro). O exemplo abaixo estava sendo executado com o Java 8 sem nenhuma opção:

  //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)