Должна ли операция карты вызываться в этом Java потоке? - PullRequest
0 голосов
/ 10 января 2020

Предполагая, что это использование логически (т. Е. Оно вычисляет желаемое логическое значение) правильно:

boolean matches = someObjectList
            .stream()
            .anyMatch(myObjType -> !myObjType.getSomeStatusString().equals("someStatus"));

как бы это сравнить с:

boolean matches = someObjectList
            .stream()
            .map(myObjType -> myObjType.getSomeStatusString())
            .anyMatch(status -> !status.equals("someStatus"));

Одна форма объективно лучше, чем другой? Есть ли существенная разница в байт-коде? Является ли один анти-шаблон? Есть ли какой-нибудь оптимизатор Java, который делает один лучше другого? Меня не интересуют разногласия, основанные на мнении, такие как первое более читабельно, так как оно может отличаться от читателя к читателю ....

1 Ответ

0 голосов
/ 14 января 2020

Я наткнулся на ответ, который искал в этом вопросе SO

Выбранный ответ (обсуждающий сборку мусора) частично говорит:

В реализации, такие как Hotspot JVM, каждый поток использует буфер локального выделения потока (TLAB) для новых объектов. Как только его TLAB заполнится, он выберет новый из пространства выделения (или Eden space). Если его нет, будет запущена сборка мусора. Теперь маловероятно, что все потоки одновременно достигают конца своего TLAB. Таким образом, для других потоков, которые еще имеют некоторое пространство в своем TLAB, оставленном на данный момент, не имело бы никакого значения, если бы они выделили еще несколько объектов, все еще вписывающихся в это оставшееся пространство.

Возможно, удивительно вывод заключается в том, что не каждый выделенный объект влияет на сборку мусора , то есть чисто локальный объект, выделенный потоком, не вызывающим следующий g c, может быть полностью свободным.

Мой вывод заключается в том, что создание «лишних» объектов при втором подходе не требует объективных затрат. Таким образом, я не верю, что существует какая-либо объективная польза от одной формы над другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...