Java 8 Stream vs For
Java 8 문법을 공부하다, Stream을 배운 후 정말 편리한 기능이구나 라는걸 느끼면서
근데 성능은 어떻게 되려나...? 하는 궁금증이 생겨 찾은 내용을 정리했다.
우선 결론부터 말하자면 Stream은 알고리즘 문제를 풀거나 시간효율적인 측면에서 중요한 곳에서는 안쓰는게 맞는 것 같다
For-loop(반복문)을 이용한 배열 접근 후 최댓값 도출
int[] a = ints;
int e = ints.length;
int m = Integer.MIN_VALUE;
for(int i=0; i < e; i++)
if(a[i] > m) m = a[i];
Stream을 이용한 배열 접근 후 최댓값 도출
int m = Arrays.stream(ints)
.reduce(Integer.MIN_VALUE, Math::max);
두 코드를 동작시킨 환경에서의 성능차이는 다음과 같다.
성능 테스트 1
https://jaxenter.com/java-performance-tutorial-how-fast-are-the-java-8-streams-118830.html
https://jeong-pro.tistory.com/185
성능 테스트 2
위 블로그에서 실험한 결과를 토대로 하면
분명 Stream이 더 빠른경우가 있긴하다. 하지만 일반적으로는 For-loop이 빠른 것은 이 실험에서도 드러났다.
https://pamyferret.tistory.com/49
또한 위 블로그에 따르면
For-loop이 더 빠른 이유를 설명해놓았는데
1. for문은 단순 인덱스 기반이다.
for문은 단순 인덱스 기반으로 도는 반복문으로 메모리 접근이기 때문에 Stream에 비해 빠르고 오버헤드도 없다.
stream의 경우는 JVM이 이것저것 처리해줘야하는 것들이 많아 실행 시 느릴 수 밖에 없다.
2. for문은 컴파일러가 최적화를 시킨다.
stream은 java 8부터 지원한 것이고 for문은 그보다 훨씬 오래전부터 계속 사용해왔다.
그만큼 사용되는 컴파일러는 오래 사용된 for문에 대한 처리가 되어 있어 for문의 경우 미리 최적화를 시킬 수 있지만,
stream의 경우 신생(?)인 만큼 정보가 없어 for문과 같은 정교한 최적화를 수행할 수 없다.
위 두가지 이유가 For-loop이 더 성능이 좋은 설득력이 높은 근거라고 생각한다.
무조건적으로 쓰지 말아야하는건 절대 아니라고 생각하고, 이에 대한 효율적인 쓰임새는 역시 짬바에서 나오지 않을까... 싶은 생각과 함께 나름대로 결론을 정리했다.