1. 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);
}
}

2. 결과

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배라고 했지만 이것은 틀린 결과고 위 표가 맞는 지표다.

3. 결론

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
복사했습니다!