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 и т.д.).
- Используйте внутренние классы для часто называемых критически важных функций.