2022.12.13 TIL

SUADI·2022년 12월 13일
0

오늘의 커밋

  • for-loop -> stream

[1] 성능비교

중간 발표 때 service 단 api들의 for 문으로 이루어진 로직들을 stream으로 바꿔 보라는 피드백을 받았다. 항해를 시작하기 이전부터 stream이 성능이 좋지 않다는 괴소문(?)을 들어왔던 터라 일부러 stream을 사용하지 않아왔었는데 이번 기회에 for-loop와 stream 성능 비교를 해보았다.

'해시태그별 게시물 목록 조회' api를 for-loop와 stream 각각의 로직을 System 클래스의 nanotime() 메서드를 이용하여 성능 비교를 진행하였다. (5회를 실시 한 후 평균을 내는 방식이고 시간은 ms 기준이다.)

횟수for-loopstream
테스트16641139
테스트2909806
테스트37601012
테스트410521099
테스트5853833
평균847977

평균치로 계산해 보았을 때 for-loop가 stream보다 약 1.15배 성능이 좋다. 성능 차이가 생각보다 크게 나지는 않았다. 그렇다면 stream이 성능이 좋지 않다는 괴소문은 어디서부터 비롯된 것일까? 공부를 해보니 stream이 성능이 좋지 않다는 것은 틀린 말은 아니였다. Wrapper 타입의 컬렉션의 비교보다 원시 타입의 배열의 성능 측정에서 성능 차이가 훨씬 더 두드러진다고 한다.

그렇다면 왜 for문이 stream보다 빠를까?

  1. for문은 단순 인덱스 기반이다.

    stream을 이용하려면 stream 객체를 생성해야 하는데 객체 생성 과정에서 여러 작업들이 이루어지기 때문에 오버헤드가 발생하게 되지만, for문은 단순 인덱스 기반으로 도는 반복문이기 때문에 stream에 비해 빠르다.

  2. for문은 컴파일러가 최적화를 시킨다.

    for문의 경우 자바라는 언어의 탄생 이래로 함께 해온 문법이기 때문에 JVM에 최적화가 잘되어 있는 반면, stream은 자바8부터 나온 문법이기 때문에 최적화가 덜 되어있다.

이 이외에도 for-loop가 stream에 비해 stack trace가 간단하고 명확하기 때문에 디버깅에 이점이 있기에 for-loop 역시 확실한 장점을 지니고 있다.

그럼에도 불구하고 멘토님께서 stream을 사용해 보라는 피드백을 주신데에는 이유가 있을거라고 생각하고 stream을 사용해야만 하는 이유에 대해 찾아보았다.

  1. 가독성이 좋아진다.

    오늘날의 하드웨어는 충분히 빠르기 때문에 유의미하지 않은 성능 차이를 고려하기 보다는 가독성 및 유지보수를 위해 stream을 사용하곤 한다. for 문의 경우 로직에 따라 indent depth가 깊어져 가독성이 떨어질 수 있는 반면, stream은 보다 간결하게 표현이 가능하다.

  2. 코드로 작성해야하는 로직을 stream에서 제공해주는 함수로 간단하게 해결 가능하다.
    단순 forEach만을 사용하는 로직의 경우 for 문을 사용하는게 오히려 더 이득이 될 수 있지만, 로직이 복잡할 경우, filter, sorted, map 등의 stream에서 제공해주는 함수를 사용할 경우 코드를 더욱 간결하게 작성할 수 있다.

0개의 댓글

관련 채용 정보