Лямбда против анонимной производительности внутреннего класса: снижение нагрузки на ClassLoader?
Я хотел бы знать, насколько велико преимущество лямбды в Java 8. Я согласен, что иногда использование лямбды может быть более читабельным, но действительно ли это так сильно влияет на производительность? Или это в основном сфокусировано как синтаксический сахар? Я иногда предпочитаю анонимные внутренние классы; я действительно теряю много преимуществ, когда я не использую лямбду все время?
Единственный? Большой? мне кажется, что прирост производительности заключается в том, что мы не создаем классы, которые загрузчик классов должен загружать в начале программы, например, создавая множество потоков:
Thread t = new Thread(new Runnable() {
public.....
});
создает классы как Sample$1.class
,
Кроме этого, есть ли какая-либо производительность или другие скрытые преимущества, помимо читабельности, удобства обслуживания и т. Д. Кода? Где-то спрятан в JVM? Я видел подобные вопросы, но большинство из них были сосредоточены на визуальной стороне; Я не заинтересован в этом. Вопрос из любопытства после просмотра взлома Java 8 Lambdas с Venkat Subramaniam.
2 ответа
У Oracle есть презентация, охватывающая некоторые различия в производительности. Похоже, что существует довольно много факторов, которые влияют на производительность лямбда-классов против анонимных классов.
http://www.oracle.com/technetwork/java/jvmls2013kuksen-2014088.pdf
После прочтения PDF, связанного с @Brett Okken, я считаю, что верно следующее:
- Внутренние классы имеют немного более низкую производительность при первом использовании, но это кажется незначительным.
- При частом вызове лямбды имеют более низкую производительность из-за большего стека, который они создают при вызове.
Я буду придерживаться следующего:
- Используйте Lambdas для удобства чтения, когда потеря производительности на несколько миллисекунд не является проблемой (GUI и т. Д.)
- Используйте внутренние классы для часто вызываемых, критичных к производительности функций.