Ответ
Нет, для такой простой и лёгкой операции над малым диапазоном данных parallelStream() будет значительно медленнее из-за накладных расходов на:
- Разделение (fork) данных на части.
- Распределение задач по потокам в
ForkJoinPool. - Синхронизацию и объединение (join) результатов.
Пример и бенчмарк:
// Последовательный стрим (эффективно)
long sequentialSum = LongStream.rangeClosed(1, 100).sum();
// Параллельный стрим (неэффективно из-за накладных расходов)
long parallelSum = LongStream.rangeClosed(1, 100).parallel().sum();
Когда parallelStream() полезен:
- Большой объём данных (десятки/сотни тысяч элементов).
- "Тяжёлые" операции над каждым элементом (сложные вычисления, блокирующие I/O).
- Источник данных легко делится (например,
ArrayList,IntStream.range).
Правило: Всегда измеряйте производительность с помощью бенчмарков (JMH) перед использованием параллельных стримов. Для тривиальных операций (sum(), filter() на малых данных) последовательный стрим почти всегда быстрее.
Ответ 18+ 🔞
Да ты посмотри, какой народ-то безмозглый, блядь! Взял и на всё подряд parallelStream() сунул, как мартышка на бананы набрасывается. А потом орет: "Почему у меня всё тормозит, ёпта?!"
Слушай сюда, распиздяй. Вот представь: тебе нужно один кирпич через дорогу перенести. Ты что, будешь ради этого целый экскаватор вызывать, блядь? Нет, ты его в руках перетащишь и всё. А вот если тебе целую гору кирпичей — тогда да, экскаватор в дело.
Так и тут. Для вот этой хуйни, где всего сто циферок сложить, parallelStream() — это как экскаватор для одного кирпича. Он же, сука, сначала будет полдня этот стрим на куски пилить, потом по потокам раскидывать, а потом всё обратно склеивать. Овердохуища накладных расходов, а толку — ноль ебать.
Вот смотри, как это выглядит в коде, если ты совсем уже, блядь, тормоз:
// Нормальный, человеческий способ. Быстро и понятно.
long sequentialSum = LongStream.rangeClosed(1, 100).sum();
// Способ для особо одарённых, которые любят всё усложнять.
// Создаст кучу шума, а результат будет тот же, только медленнее.
long parallelSum = LongStream.rangeClosed(1, 100).parallel().sum();
А теперь, блядь, главное — когда этот твой parallelStream() реально нужен, а не просто чтобы понтоваться?
- Когда данных — овердохуища. Не сто штук, а сотни тысяч, миллионы. Вот тогда делить есть что.
- Когда над каждым элементом надо мозги сломать. Не просто сложить, а там хитрые вычисления провести, или в базу сходить, или файл прочитать.
- Когда источник данных не упоротый.
ArrayListилиIntStream.range— легко делится. А вотLinkedListилиStream.iterate— уже пиздец, там делить-то нечего.
И самое главное, запомни, как "Отче наш": НИКОГДА НЕ ВЕРЬ НА СЛОВО, ВСЕГДА ПРОВЕРЯЙ!
Прежде чем везде воткнуть parallel(), запусти нормальный бенчмарк, через JMH, например. А то так и будешь ходить с видом "я оптимизатор", а на деле просто пиздопроёбина получается.
Для простых операций на малых данных обычный, последовательный стрим — твой лучший друг, чувак. Не выёбывайся.