iOS 런치타임 개선

Launch Time 개선작업을 진행하면서 알게된것들을 간략하게 정리해보았습니다.
먼저 Launch Time은 크게 두가지로 나눌수 있습니다.
pre-main() tiem + post-main()time = Totla time of App Launch Time

Post-main() time

main()함수가 호출되고 applicationWillFinishLaunching과 같은 델리게이트 함구사 호출된 이후를 말합니다.
이 때는 AppDelegate에서 코드를 확인하면서 느린 이유를 알 수 있습니다.

Pre-main() time

델리게이트가 호출되기전 pre-main() time 속도 개선이 문제였는데, iOS10부터는 아래 사진과 같이 DYLD_PRINT_STATISTICS 환경변수를 추가하여 쉽게 확인을 할 수 있습니다.
설정한 뒤 실행을 하게 되면 콘솔에 아래와 같이 찍힌것을 확인할 수 있습니다.
현재 dylib loading time이 유독 긴것을 확인 할수 있습니다.
테스트 할 때 지원하는 기기중 가장 느린 기기를 사용하는것이 좋습니다.

dylib loading time

먼저 dylib loading time은 다이나믹라이브러리를 읽어오는 시간인데 dylib의 속도를 향상시키기 위해서는 적은 라이브러리를 사용하거나 라이브러리들을 병합하거나 스태틱 라이브러리를 사용할 것을 추천합니다.애플에서는 6개 이하의 라이브러리를 사용할것을 가이드 하고 있습니다.
(기존에는 Swift프로젝트일경우 Swift를 읽어오는 시간도 있었지만 Swift5부터는 내장되었습니다)

Rebase/ binding time

다음으로 Rebase/ binding time은 objective-c 클래스가 많거나, selector, category가 많은경우 시간이 늘어나게 된다고 합니다.

Objective-c setup time

이부분은 rebase/binding과 연관되어 클래스 등록, selector 유니크화, 카테고리 등록을 한다고 합니다.
위 두가지 시간을 개선하기 위해서 selector나 category사용을 줄여야 하는가 싶기도 한데 흠... 어렵네요..가능하면 Class보다는 Struct를 이용하는것이 더 좋다고 합니다.Initializer time마지막으로
Initializer time은 Objective-c에서 +load메서드를 initilize로 변경해서 개선할수 있습니다.
2016 wwdc세션을 첨부하겠습니다.
이 부분은 부족한게 많아서 좀 더 공부를 해야겠네요.