В Java, будет ли `parallelStream()` быстрее обычного `stream()` для сложения чисел от 1 до 100?

«В Java, будет ли `parallelStream()` быстрее обычного `stream()` для сложения чисел от 1 до 100?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, для такой простой и лёгкой операции над малым диапазоном данных 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() на малых данных) последовательный стрим почти всегда быстрее.