Pull to refresh

Comments 5

произвело революцию в том, как мы выполняем потоковые операции.

Ну вот если честно — нет, не произвело. Причем вы же выше написали, почему — потому что не все операции подходят, потому что то, потому что сё. Много ограничений. Недостаточно гибкое управление создаваемыми потоками. Сами стримы и лямбды — да, это была революция, это очень сильно повлияло на то, как люди стали писать программы на Java. А параллельные стримы — ну я вот вообще вряд ли смогу вспомнить, видел ли я их когда-либо у кого-то в коде. Пожалуй что и нет.

Для меня Stream API — более удобный, компактный, функциональный, но не всегда эффективный сам по себе, как и Parallel Stream. Зачастую нужно профилировать.))
Кстати, если кто-то не в курсе, то начиная с версии 2017.3 в IDEA встроен Stream Debugger во вкладке Trace Current Stream Chain:

На небольших коллекциях такое распараллеливание только замедляет процесс. В докладах Шипилёва звучала цифра в 10_000 элементов коллекции — после нее распараллеливание стрима может дать положительный эффект. А может и не дать, надо бенчить.

Неплохо было бы привести примеры, где использование параллельных стримов оправдано и дает преимущество в скорости, согласно перфоманс тестов. Также неплохо было бы привести примеры, где параллельные стримы приводят к побочным эффектам.

Вот я решал такую задачу для своего бота:

Чтобы исключить одинаковые заголовки новостей, я пробегался по одной и той же коллекции два раза через вложенный enhanced for цикл. Т.е. первый заголовок сверяется со всеми остальными заголовками, потом второй сверяется со всеми и так 800 штук, итого 640 000 итераций. Выполнялось за 18 секунд, очень долго. Удалять элемент из коллекции нельзя, т.к. ConcurrentModificationException, через Iterator.hasNext() что-то не заладилось, В итоге сделал так:
JaroWinkler jwd = new JaroWinkler();

headlinesToShow.parallelStream()
.forEach(h1 -> headlinesToShow.forEach(h2 -> {
int compare = jwd.compare(h1.getTitle(), h2.getTitle());
if (compare >= 85 && compare != 100) {
headlinesJw.add(headline1); }
}));

Стало работать за пол секунды. Причём когда я после второго forEach ставил parallelStream, то творилась какая-то жесть, поэтому второй цикл без parallelStream.
Я не знаю, может оптимальнее правда было сделать через Iterator. Что думаете?

Sign up to leave a comment.

Articles