자바

순차 스트림 VS 병렬 스트림

PSW 2025. 1. 21. 17:29

1. 순차 스트림이란?

- 데이터 처리가 한 스레드에서 순차적으로 실행된다

- 스트림의 요소를 처음부터 끝가지 차례로 처리한다.

- 실행 순서가 보장된다.

  • 장점
    - 실행 순서가 명확하게 보장되므로 예측 가능한 결과를 제공
    - 작은 데이터셋이나 간단한 작업에 적합
    - 스레드 관리 오버헤드가 없어서 병렬 스트림 보다 가볍다
  • 단점
    - 대용량 데이터를 처리하거나 복잡한 연산이 필요한 경우 성능이 제한된다.

 

2. 병렬 스트림이란?

- 데이터를 여러 스레드로 분할하여 병렬로 처리

- 내부적으로 ForkJoinPool을 사용하여 작업을 병렬 처리한다.

- 실행 순서를 보장하지 않으며, 결과의 순서를 중요하게 생각하지 않을 때 적합하다.

  • 장점
    - 대용량 데이터를 처리할 때 처리 속도를 크게 향상할 수 있다.
    - CPU 코어를 효율적으로 활용하여 멀티코어 환경에서 성능을 극대화한다.
  • 단점
    - 스레드 관리와 데이터 분할로 인한 오버헤드가 발생할 수 있다.
    - 작은 데이터셋에서는 순차 스트림보다 느릴 수 있다.
    - 실행 순서를 보장하지 않아 순서 의존적인 작업에 적합하지 않다.

병렬 스트림 사용할 때 주의점

  1. 순차 스트림과 병렬 스트림을 벤치마크로 직접 성능을 측정해서 선택
  2. 자동 박싱과 언박싱은 성능을 크게 저하시킬 수 있다. 되도록이면 기본형 특화 스트림을 사용하자
  3. limit나 findFirst처럼 요소의 순서에 의존하는 연산은 병렬 스트림에서는 비싼 비용을 치러야 한다.
  4. 처리해야 할 요소 수가 N이고 하나의 요소를 처리하는 데 드는 비용을 Q라 하면 전체 스트림 파이프라인 처리 비용을 N*Q로 예상할 수 있다. Q가 높아진 다는 것은 병렬 스트림으로 성능을 개선할 수 있는 가능성이 있다.
  5. 소량의 데이터셋에서는 병렬 스트림이 도움이 되지 않는다.
  6. 스트림을 구성하는 자료구조가 적절한지 확인하자. 예를 들어 ArrayList를 LinkedList보다 효율적으로 분할할 수 있다. LinkedList를 분할하려면 모든 요소를 탐색해야 하지만 ArrayList는 요소를 탐색하지 않고도 리스트를 분할할 수 있다. 또 range팩토리 메서드로 만든 기본형 스트림도 쉽게 분해할 수 있다.
  7. 최종 연산의 병합 과정 비용을 잘 보자. 병합 과정의 비용이 비싸다면 병렬 스트림으로 얻은 성능의 이익이 서브스틺의 부분 결과를 합치는 과정에서 상쇄될 수 있다.

 

 

 

 

'자바' 카테고리의 다른 글

람다 캡처링(Capturing lamda)  (1) 2024.12.31
FACTORY 패턴  (2) 2024.12.20
디미터 법칙과 캡슐화  (0) 2024.12.19
POLYMORPHISM 패턴  (0) 2024.12.19
캡슐화  (0) 2024.12.16