반응형
자바 스트림 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()은 기본형 스트림을 통해 평균값을 빠르게 계산할 수 있습니다.
📌정리하자면, 이번 예제에서는 일반 스트림과 병렬 스트림의 처리 시간을 직접 비교해보았습니다.
병렬 스트림은 대용량 데이터를 다룰 때 효율적이지만,
항상 더 빠르다고 단정할 수는 없으며 상황에 맞는 사용 판단이 중요합니다.
'Java > 자바 정리' 카테고리의 다른 글
181. groupingBy() + averagingDouble() – 그룹별 평균 구하기 (1) | 2025.05.27 |
---|---|
180. groupingBy()를 사용한 스트림 분류 – 성별로 그룹화하기 (0) | 2025.05.26 |
179. 스트림 결과 수집하기 – toList()와 Collectors.toMap() 활용 (0) | 2025.05.26 |
178. 스트림 집계 연산 – sum() vs reduce() (0) | 2025.05.26 |
177. Optional로 평균 처리하기 – isPresent, orElse, ifPresent 활용 (0) | 2025.05.26 |
176. 스트림 집계(Aggregate) 연산 – count, sum, average, max, min, findFirst (0) | 2025.05.26 |