[이펙티브 자바] 아이템 48. 스트림 병렬화는 주의해서 적용하라

June·2022년 3월 5일
0

[이펙티브자바]

목록 보기
43/72

동시성 프로그램밍을 할때는 안전성과 응답 가능 상태를 유지하기 위해 신경써야 한다.

메르센 소수 생성 프로그램

    public static void main(String[] args) {
        primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE))
                .filter(mersenne -> mersenne.isProbablePrime(50))
                .limit(20)
                .forEach(System.out::println);
    }

    static Stream<BigInteger> primes() {
        return Stream.iterate(TWO, BigInteger::nextProbablePrime);
    }

메르센 소수란 소수 가운데 ‘2의 n승 빼기 1’로 표현되는 소수를 말한다.

7초만에 완료되었다.

성능 향상을 위해서 병렬 처리를 해보자.

    public static void main(String[] args) {
        primes().parallel()
                .map(p -> TWO.pow(p.intValueExact()).subtract(ONE))
                .filter(mersenne -> mersenne.isProbablePrime(50))
                .limit(20)
                .forEach(System.out::println);
    }

parallel()을 추가해주었다.

실행을하면 CPU만 계속 잡아머곡 결과가ㅣ 나오지 않는다.

이유는 이 파이프라인을 병렬화하는 방법을 찾아내지 못했기 때문이다. 환경이 아무리 좋아도 데이터 소스가 Stream.iterate거나 중간 연산으로 limit를 쓰면 파이프라인 병렬화로는 성능 개선이 안된다.

스트림의 소스가 ArrayList, HashMap, HashSet, ConcurrentHashMap의 인스턴스거나 배열, int 범위, long 범위일 때 병렬화의 효과가 가장 좋다. 이 자료구조들의 공통점은 데이터를 원하는 크기로 나눠서 다수의 스레드에 분배하기 좋다는 특징이 있다.

또 다른 공통점은 원소들을 순차적으로 실행할 때 참조 지역성(locality of reference)가 뛰어나다는 것이다. 참조 지역성이 낮으면 스레드는 데이터가 주 메모리에서 캐시 메모릴로 전송되어 오기를 기다리며 기다리게 된다. 따라서 배열 같이 참조 지역성이 뛰어난 자료구조가 다량의 데이터를 처리하는 벌크 연산 병렬화에 유리하다.

종단 연산도 영향을 많이 준다. 만약 종단 연산이 순차적인 연산이면 병렬 수행의 효과가 떨어진다. 종단 연산 중 병렬화에 가장 적합한 것은 축소(reduction)이다. 파이프라인에서 만들어진 모든 원소를 하나로 합치는 작업으로 (min, max, count, sum)과 같이 사용된다. anyMatch, allMatch, noneMatfch 처럼 조건에 맞으면 바로 반환되는 메서드도 적합하다.

반면 가변 축소(mutable reduction)를 수행하는 Stream의 collect 메서드는 병렬화에 적합하지 않다.
컬렉션들을 합치는 부담이 크기 때문이다.

스트림을 잘못 병렬화하면 성능이 나빠지거나 결과 자체가 잘못될 수도 있다.

스트림 최적화 역시 다른 최적화와 마찬가지로 변경 전후로 성능 테스트를 하여 가치가 있는지 테스트해야 한다.

병렬 스트림 파이프라인도 같은 스레드 풀을 사용하므로, 잘못된 파이프라인 하나가 다른 부분에도 영향을 미칠 수 있다.

스트림 파이프라인 병렬화를 잘 사용할 일이 없지만, 잘 사용하면 프로세서 코어 수에 비례하는 성능 향상이 일어나기도 한다.

무작위 수드롤 이뤄진 스트림을 병렬화하려거든 ThreadLocalRandom보다는 SplittableRandom인스턴스를 이용하자.

0개의 댓글