Разница в производительности между Java 8 lambdas и анонимными внутренними classами

До Java 8 функциональность lambda могла быть достигнута с помощью анонимных внутренних classов. Например:

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

Что касается производительности, существует ли разница между использованием этого подхода и использованием новых ямбдов Java 8?

Oracle опубликовала исследование, сравнивающее производительность между Lambdas и анонимными classами

См. JDK 8: Исследование производительности lambda Сергея Куксенко, которое составляет 74 слайда.

Резюме: медленное прогревание, но когда JIT встраивает его в худший случай так же быстро, как анонимный class, но может быть быстрее.

Как я нашел, итерация по массиву с помощью Stream работает намного медленнее (74 слайда не учитывают такой случай). Я думаю, что это не единственная утечка производительности в lambdaх (предположим, в будущем она будет улучшена). Пример ниже выполнялся с Java 8 без каких-либо параметров:

  //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) 
  • Как ускорить запуск Java VM (JVM)?
  • Как изменить язык приложений iPhone во время выполнения?
  • Секундомер против использования System.DateTime.Now для событий синхронизации
  • Снижается ли производительность при выполнении циклов, чей счетчик uop не кратен ширине процессора?
  • более быстрый способ создания переменной, которая агрегирует столбец по id
  • Инструменты для измерения затрат на связь MPI
  • Какие счетчики perfmon полезны для выявления узких мест ASP.NET?
  • Что быстрее: распределение стека или выделение кучи
  • Есть ли разница в производительности между Javac debug on и off?
  • Храните PostgreSQL от выбора плохого плана запроса
  • Создание m различных случайных чисел в диапазоне
  • Давайте будем гением компьютера.