JMH 를 활용

System.currentTimeMillis() 를 이용하여 테스트를 했지만 조금 더 정확하게 확인을 해보고 싶다는 분들이 꽤 많았고,
성능 테스트를 검색하니 JMH 가 가장 먼저 나와 이 성능 측정 툴로 테스트해보았다.

@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class StreamTest {

    private List<Long> list;

    @Setup
    public void setUp() {
        list = new ArrayList<>();
        for (long i = 0; i < 5_000_000; i++) {
            list.add(i);
        }
    }

    @Benchmark
    public void mapToLongSumBenchmark(Blackhole blackhole) {
        blackhole.consume(mapToLongSum(list));
    }

    @Benchmark
    public void reduceSumBenchmark(Blackhole blackhole) {
        blackhole.consume(reduceSum(list));
    }

    public long mapToLongSum(final List<Long> longList) {
        return longList.stream()
                .mapToLong(l -> l)
                .sum();
    }

    public Long reduceSum(final List<Long> longList) {
        return longList.stream()
                .reduce(0L, Long::sum);
    }
}

결과

Benchmark Mode Cnt Score Error Units
StreamTest.mapToLongSumBenchmark avgt 5 4286275.030 ± 246133.903 ns/op
StreamTest.reduceSumBenchmark avgt 5 16327911.159 ± 2651781.406 ns/op

 

System.currentTimeMillis() 로 2배에서 6배라고 했지만 이것은 틀린 결과고 위 표가 맞는 지표다.

결론

mapToLong.sum 으로 연산하는 것이 reduce(0, Long::sum) 보다 약 3배 ~ 3.8배 빠르다. 즉, 이전에 썼던 글과 같이 각 자료형 스트림 인터페이스의 sum() 을 사용하는 것이 더 빠르다는 것을 유추할 수 있다.

'java > 기초문법' 카테고리의 다른 글

스트림 reduce(0, type::sum) vs sum()  (2) 2023.04.24
[Java] 배열  (0) 2022.12.29
[Java] 변수란?  (0) 2022.11.25
[Java] 조건문과 반복문  (0) 2022.01.12
[Java] 자바 자료형, 형 변환  (0) 2022.01.09
복사했습니다!