Stream vs For loop
Stream vs For loop
Stream vs For loop
Java에서 반복문을 수행하기 위해 stream을 이용하거나 for loop를 사용 가능. 두 방법에는 각각 장단 존재
- Stream은 lazy하게 연산의 파이프라인을 반환하고, 마지막에 한꺼번에 연산함
- For loop는 단순히 인덱스 기반으로 계산하지만, stream은 JVM에서 추가로 수행하는 연산들이 존재하기 때문에 오버헤드 존재
- JIT 컴파일러가 40년 이상 for loop를 다뤄왔기 때문에 최적화가 잘 되었으나, stream은 아직 최적화가 부족
- For loop와 Stream을 primitive type의 데이터를 순회하는 시간을 비교하면 for loop가 압도적으로 빠름
- Primitive type의 데이터는
stack
영역에 저장되기 때문에 값을 빠르게 불러 올 수 있음
- Primitive type의 데이터는
- Primitive type의 데이터가 아닌 경우 for loop는 그만큼의 성능을 내지 못함
heap
영역에 저장되는 데이터를 참조하기 위해서는 메모리의 주소를 이용해 참조- 이 과정에서 JIT 컴파일러의 최적화 이점이 사라짐
- 순회 자체는 for loop가 빠르다고 해도, 각 원소에 대한 계산 비용이 비싸지면 얘기가 달라짐
- 계산하는데 극단적으로 오래 걸리는 함수라면, for loop가 빠르다고 보장할 수 없음
- Stream의
forEach
함수는 함수 중 가장 기능이 적고, 비효율적- 마지막에 결과를 출력할 때 사용하는 정도가 적당
- Stream에서
forEach
만 사용하는 것은 for loop보다 성능이 떨어짐
map
,filter
,reduce
와 같은 함수를 사용하면 stream을 통해 가독성 향상 가능- Stream은 복잡한 호출 구조 때문에 오류 메시지를 분석하기 어려울 수 있음
References
- https://sigridjin.medium.com/java-stream-api%EB%8A%94-%EC%99%9C-for-loop%EB%B3%B4%EB%8B%A4-%EB%8A%90%EB%A6%B4%EA%B9%8C-50dec4b9974b
- https://tecoble.techcourse.co.kr/post/2020-05-14-foreach-vs-forloop/
- https://pamyferret.tistory.com/49
- https://homoefficio.github.io/2016/06/26/for-loop-%EB%A5%BC-Stream-forEach-%EB%A1%9C-%EB%B0%94%EA%BE%B8%EC%A7%80-%EB%A7%90%EC%95%84%EC%95%BC-%ED%95%A0-3%EA%B0%80%EC%A7%80-%EC%9D%B4%EC%9C%A0/