본문 바로가기

책리뷰/모던자바인액션

JAVA 병렬 스트림 사용시 고려할 점

728x90
반응형

1. 확신이 서지 않으면 직접 측정하라.

병렬스트림이 순차 스트림보다 언제나 빠른 것은 아니다. 병렬스트림의 수행과정이 투명하지 않을 수도 있고 공유된 가변상태가 있을 경우 올바르게 동작하지 않을 수도 있다.(스레드에서 공유하는 객체의 상태를 바꾸는 경우가 있을 때)

순차스트림과 병렬스트림 중 어떤것이 좋은지 모를 때는 벤치마크로 직접 성능을 측정해라.

(JMH를 이용하여 jar로 만들어서 벤치마크)

 

2. 박싱을 주의하라.

자동박싱과 언박싱은 성능을 크게 저하시킬 수 있다. 박싱동작을 피할 수 있도록 기본형 특화 스트림(IntStream, LongStream, DoubleStream)을 사용하는 것이 좋다.

 

3. 순차스트림보다 성능이 떨어지는 연산이 있다.

병렬스트림에서 limit, findFirst처럼 요소의 순서에 의존하는 연산을 수행할 경우 비싼 비용이 든다. 

findAny는 순서와 상관없으므로 성능이 좋다. 스트림에 요소의 순서가 상관없다면 효율적이다.

 

4. 스트림에서 수행하는 전체 파이프라인 연산 비용을 고려하라.

처리해야할 요소가 N, 처리 비용이 Q일 경우 N*Q로 스트림 파이프라인 처리비용을 예상할 수 있다.

Q가 높아질 경우 병렬 스트림으로 성능을 개선할 수 있는 가능성이 있다.

 

5. 소량의 데이터에서는 병렬스트림이 도움되지 않는다.

소량의 데이터를 처리하면서 병렬화하면 그 과정에서 생기는 부가 비용을 커버할 만큼의 이득을 얻지 못한다. 

 

6. 스트림을 구성하는 자료구조가 적절한지 확인하라.

ArrayList가 LinkedList보다 효율적으로 분할할 수 있다.(LinkedList는 모든 요소를 탐색해야한다.)

 

7. 스트림의 특성과 파이프라인의 중간연산이 스트림의 특성을 어떻게 바꾸는지에 따라 분해 과정의 성능이 달라질 수 있다.

SIZED 스트림은 정확히 같은 크기의 두 스트림으로 분할하기 때문에 병렬처리가 효과적이다.

필터는 스트림의 길이를 예측할 수 없으므로 효과적인 병렬처리를 기대할 수 없을 지도 모른다.

 

8. 최종 연산의 병합과정 비용을 살펴보라.

병합과정이 비싸면 서브스트림의 부분결과를 합치는 과정에서 상쇄될 수 있다. 

 

728x90
반응형