Java/자바 정리

182. 병렬 스트림 성능 비교 – stream() vs parallelStream()

코딩하는냥이 2025. 5. 27. 10:05
반응형

자바 스트림 API에서는 parallelStream()을 사용하면 데이터를 병렬로 처리할 수 있습니다.
특히 데이터 양이 많을수록 성능 차이가 확연하게 나타날 수 있는데요,
이번 예제에서는 1,000만 개의 점수를 대상으로 일반 스트림과 병렬 스트림의 처리 시간을 비교해보겠습니다.


📌 예제 코드

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

public class ParallelExample {
	public static void main(String[] args) {
		Random rand = new Random();
		List<Integer> scores = new ArrayList<Integer>();

		// 1,000만 개의 랜덤 점수 생성
		for (int i = 0; i < 10000000; i++)
			scores.add(rand.nextInt(101));  // 0 ~ 100 사이의 점수

		double ave = 0.0;
		long startTime = 0, endTime = 0, time = 0;

		// 일반 스트림 처리
		Stream<Integer> stream = scores.stream();
		startTime = System.nanoTime();
		ave = stream.mapToInt(i -> i.intValue()).average().getAsDouble();
		endTime = System.nanoTime();
		time = endTime - startTime;
		System.out.println("avg : " + ave + ", 일반 스트림 처리 시간 : " + time + "ns");

		// 병렬 스트림 처리
		Stream<Integer> parallelStream = scores.parallelStream();
		startTime = System.nanoTime();
		ave = parallelStream.mapToInt(i -> i.intValue()).average().getAsDouble();
		endTime = System.nanoTime();
		time = endTime - startTime;
		System.out.println("avg : " + ave + ", 병렬 스트림 처리 시간 : " + time + "ns");
	}
}

💻 실행 결과 (예시)

avg : 50.00491, 일반 스트림 처리 시간 : 158371210ns
avg : 50.00491, 병렬 스트림 처리 시간 : 64257192ns

※ 실제 실행 시간은 사용 환경 및 CPU 코어 수에 따라 달라질 수 있습니다.


💬 코드 설명

  • stream()
    → 데이터를 순차적으로 처리합니다.
  • parallelStream()
    → 내부적으로 Fork/Join Pool을 사용해 데이터를 병렬로 나누어 처리합니다.
  • System.nanoTime()
    → 코드 실행 전후의 시점을 나노초 단위로 측정하여 정확한 처리 시간을 구합니다.

💡 포인트 정리

  • parallelStream()은 대량의 데이터 처리 시 성능 향상을 기대할 수 있습니다.
  • 하지만 작은 데이터나 간단한 연산에서는 오히려 오버헤드가 더 커질 수 있으니 주의해야 합니다.
  • 병렬 스트림은 멀티코어 CPU를 활용할 수 있는 환경에서 특히 효과적입니다.
  • .mapToInt().average().getAsDouble()은 기본형 스트림을 통해 평균값을 빠르게 계산할 수 있습니다.

📌정리하자면, 이번 예제에서는 일반 스트림과 병렬 스트림의 처리 시간을 직접 비교해보았습니다.
병렬 스트림은 대용량 데이터를 다룰 때 효율적이지만,
항상 더 빠르다고 단정할 수는 없으며 상황에 맞는 사용 판단이 중요합니다.