Lambda против анонимного внутреннего класса: снижение нагрузки на ClassLoader?

Я хотел бы знать, насколько велики преимущества lambdas в Java 8. Я согласен с тем, что иногда лучше использовать lambdas, но действительно ли это имеет большое влияние на производительность? Или это в основном сосредоточено как синтаксический сахар? Иногда я предпочитаю анонимные внутренние классы; действительно ли я теряю много преимуществ, когда я не использую лямбду все время?

Единственный? большой? производительность, как мне кажется, заключается в том, что мы фактически не создаем классы, которые загрузчик классов должен загружать в начале программы - например, создавая много потоков:

Thread t = new Thread(new Runnable() {
   public.....
});

создает классы типа Sample$1.class.

Кроме того, есть ли какая-либо производительность или другой скрытый выигрыш, кроме читаемости или ремонтопригодности и т.д. кода? Скрыт где-нибудь в JVM? Я видел вопросы, подобные этому, но большинство из них были сосредоточены на визуальной стороне; Меня это не интересует. Вопрос не из любопытства после просмотра Java 8 Lambdas Hacking с Venkat Subramaniam.

Ответ 1

В Oracle есть презентация, отражающая некоторые отличия в производительности. Похоже, что существует немало факторов, влияющих на производительность lambdas против анонимных классов.

http://www.oracle.com/technetwork/java/jvmls2013kuksen-2014088.pdf

Ответ 2

После чтения PDF файла, связанного с @Brett Okken, я считаю, что выполняется следующее:

  • Внутренние классы имеют немного более медленную производительность при первом использовании, но это кажется небрежным.
  • У Lambdas более низкая производительность при частом вызове из-за того, что они больше наращиваются при вызове.

Я буду придерживаться следующего:

  • Используйте Lambdas для удобства чтения, когда потеря производительности в несколько миллисекунд не является проблемой (файлы GUI и т.д.).
  • Используйте внутренние классы для часто называемых критически важных функций.