Комментарии 35
Если не поленюсь, будет продолжение.
Лямбды быстрее анонимных классов за счет того, что лямбды работают на invokedynamic, а анонимные классы через invokestatic, который несколько медленнее.
Что касается invokestatic vs. invokedynamic, то invokestatic самая быстрая из всех invoke* инструкций байткода, потому что не требуется никого динамического диспатча (target всегда известен) и в отличии от invokespecial, который тоже не требует динамического диспатча, не требуется передавать параметр this. Invokedynamic же в общем случае самая медленная из всех invoke* инструкций байткода, хотя она сильно зависит от методхэндла колсайта, который возвращает бутстрэп метод. Если он вернет константный колсайт invokestatic методхэндла, то после некоторых приплясываний JVM, породится идентичный код тому, как если бы вы сразу позвали метод через invokestatic.
))
Во-первых обычно больше интересует производительность, а не размер вспомогательных объектов в байтах (хотя да, бывают кейсы, когда это важно).
Во-вторых все эти байтовые размеры в принципе могут поменяться с выходом новой версии компилятора.
В-третьих если говорить про расход памяти в рантайме, то нужно говорить про размер генерируемого native-кода — ведь совсем не обязательно, что больший по размеру байткод даст больший по по размеру native-код.
Да, это всё важные вопросы, до них просто не успел дойти разговор :-) Если не поленюсь, будет продолжение спора. Ну и смысл не в том, чтобы понять, кто прав, а в том, чтобы поковыряться, как что внутри работает.
А смысл в этой статье?
Ведь понятно, что использование лямбд в любом языке в первую очередь обусловлено синтаксическим сахаром для производительности разработчика, а не для производительности кода.
Будете ли вы использовать синтаксический сахар, зная, что ваша программа от этого станет в 10 раз медленнее?
На реальных проектах у 2.12 jar'ы получаются в два-четыре раза меньше.
Но нагрузка CPU чуть больше (в пределах +10%).
Кстати, про компиляцию лямбд в скале 2.12 была долгая и весьма любопытная история. Никто не желает перевести на хабр? Вроде не было ещё :-)
Неожиданно. А что там CPU ест?
ПС
Извините за бестактный вопрос, но как начинающему java разработчику, после ознакомления с вашим выступлением на java 8 puzzler на jPoint 2016, стало интересно применение стримов, можно будет увидеть статью про них такого же характера? Тем более, что в одной из недавних статей ссылались на тикет с YouTrack об «отказе» использования стримов в коде.
А что стримы? Стримы хорошие, надо их использовать, чем больше, тем лучше :D
Тем более, что в одной из недавних статей ссылались на тикет с YouTrack об «отказе» использования стримов в коде.
Больше верьте слухам!
sah4ez32: Стримы штука хорошая. Главное помнить правило отладки — отладка программы вдвое сложнее чем ее написание. Иногда стоит пожалеть своих коллег, которым придется смотреть код.
P.S. так как использую Kotlin, который в некоторых случаях использует анонимные классы.
Вот только не совсем корректно с местом на диске вышло, в общем случае 2 файла по 800 байт займут больше места чем один, но размером в 2000 байт.
Да, согласен. Логичнее было зажать в джарик и посмотреть его размер. Всё равно россыпь класс-файлов обычно никто не использует.
Да и про джарник — из двух файлов по 800 байт jar получается больший, чем из одного 2000 байтового.
jar cvf a.jar AbstractManagerImpl.class InitializationException.class
a.jar — 1292
AbstractManagerImpl.class — 652
InitializationException.class — 609
jar cvf b.jar PlanetManager.class
b.jar — 1094
PlanetManager.class — 2652
Классы выбрал случайно, что бы по размеру подходили.
Интересно было бы всё же, по аналогии со статьёй — один класс с лямбдой или два класса (с анонимным) реализующих один и тот же функционал сравнить — это было бы более показательно…
Лямбды и анонимные классы: кто больше жрёт