https://dev.java/learn/api/streams/parallel-streams/

Optimizing Streams Computations

스트림을 병렬로 처리하는 가장 단순한 방법은 pararllel() 을 이용하는 것임.

int parallelSum = 
    IntStream.range(0, 10)
             .parallel()
             .sum();

IO.println("Sum = " + parallelSum);

하지만 병렬 스트림이 항상 정답은 아님. 쓰기 전에 다음을 물어보자.

  1. 정말 필요한가? 정말 해결해야 하는 문제가 일반적인 데이터 처리에서 병렬 스트림을 사용하면 해결될 문제인가? 그리고 그 전에 이전 처리의 성능은 어떻게 측정할 것이고, 이후에는 어떻게 측정할 것인가? 병렬스트림을 사용하면 성능이 더 좋아질거라고 어떻게 판단할 것인가?
  2. 충분한 CPU파워가 있는가?
  3. 충분한 쓰레드가 있는가? 쓰레드는 빨리 반환되지 않을수도 있다. (DB, 외부 API호출 등…)

만약 사용하기로 했다면, 병렬스트림 사용후 성능이 더 나아졌다는걸 최대한 운영환경과 유사한 곳에서 측정해야 한다.

Parallelization Implementation

스트림에서 병렬을 지원하는 API는 자바 7부터 추가된 Fork/Join 프레임워크를 기반으로 한다. 골자는 간단하다. 데이터 처리를 여러 재귀적으로 분할해 여러 쓰레드에 나눠주고, 그 결과를 다시 합치는 방식임.

물론 이 과정에 오버헤드가 있으므로 항상 정답은 아니다.

Understanding Data Locality

Iterating Over an Array of Primitive Types

메모리는 1차원이란걸 생각하자.

int[] 배열의 첫 원소를 찾아본다고 해보자. 64바이트짜리 한 라인은 16개의 int 값을 저장할 수 있다. 배열 첫 원소에 접근하는데 캐시미스가 나면 cpu는 해당 라인을 메모리에서 불러와서 캐시에 올린다.