코틀린 대용량 반복문을 효율적으로 돌리기
KotlinDeepDive #4 — Loop
안드로이드 Jetpack Compose 구현 코드를 보다가 재밌는 클래스를 발견했다.
위 코드가 발견한 재밌는 코드들 중 일부인데, 코틀린에서 기본적으로 지원하는 반복문 함수들을 대부분 ~fast 로 다시 만들어서 사용하고 있었다. 그 중에서 This does not allocate an iterator like [Iterable.forEach] 라는 주석이 눈에 띄었다. 이 주석을 이해하기 위해 공부한 내용을 기록해 본다.
forEach
위 처럼 매우 기본적인 forEach 코드가 있다. 이를 자바로 디컴파일 해 보면
처럼 결국 Iterable
로 바뀌어 while문에서 실행된다. 이 과정은 iterable을 만들어 메모리에 할당시키는 과정이 포함돼 있다. allocate an iterator like [Iterable.forEach] 주석이 이 과정을 말하는거 같다.
fastForEach
이제 동일 코드에서 forEach만 위 재밌는 코드에 있던 fastForEach로 바꾼 후 다시 자바로 디컴파일 해 보자.
기존 forEach 방식에서 Iterable
이 메모리에 할당되는 과정이 사라졌다. This does not allocate 주석이 이 결과를 말하는거 같다. 메모리에 할당하는 부분이 없어짐으로써, 반복문을 여러번 돌릴 때 forEach에 비해 메모리 사용과 시간에 대해 이점을 가져갈 수 있다.
forEach 내부 구현
forEach는 왜 Iterable
를 할당시키는걸까? forEach는 아래와 같이 구현돼 있다.
위 코드를 자바로 디컴파일 해 보면
이렇게 결국 코틀린의 in
키워드는 내부적으론 Iterable
를 통해 진행된다는걸 확인 할 수 있다.
마무리
Jetpack Compose처럼 스케일이 큰 반복문이 여러번 실행되는 환경 아니면 forEach 대신에 fastForEach를 쓴다고 해서 얻는 이점은 딱히 없을 것 같다. 이런 사소한 부분까지 다 신경써서 개발한 Jetpack Compose 개발 팀이 무섭다.. 역시 구글..!!
+ 2021.12.04 내용 추가
이에 대해서 밴치마킹한 글이 올라왔다.
참고해 보면 좋을 듯 하다.