버그 잡이

iOS - App Launch Time 줄이기 #pre-main time #static library 본문

IOS

iOS - App Launch Time 줄이기 #pre-main time #static library

버그잡이 2022. 7. 2. 12:45

 

먼저 Static Library와 Dynamic Library의 개념과 장단점에 대해서 간단하게 알아보고 넘어가겠습니다.

 

Dynamic vs Library 비교

 

Static Library

Excutable 파일에 라이브러리 파일이 포함됨

Dynamic Library

런타임 중에 필요시 해당 라이브러리 코드를 찾아서 연결

(Excutable 파일안에 코드가 있는 것이 아니라 프로그램 안에서 Framework로 따로 관리되는 개념)

 

 

# 장단점

Static Library

장점: 런타임에 해당 라이브러리 파일을 찾을 필요가 없기 때문에 앱 런치 타임 속도를 줄일 수 있음

단점: 앱 사이즈가 커짐

Dynamic Library

장점: 앱 사이즈가 작음

단점: 앱 런치 타임 속도를 느리게 할 수 있음

 

 

 

Launch Time 줄이기

 

WWDC 2016 - Optimizing App Startup Time 에서도 앱 런치 타임을 줄이기 위한 방법으로 Static Library를 쓰는 것을 이야기 합니다.

"앱 런치 타임 = pre-main time + post-main Time" 의 구조로 구성되는데

저의 앱의 pre-main Time 에서 가장 많은 부분을 차지하는게 다이나믹 라이브러리를 로드하는 시간이었습니다.

그래서 저는 CocoaPods 라이브러리들을 Static 방식으로 사용해보기 했습니다.

 

 

 

CocoaPods 라이브러리를 static 방식으로 사용하는 방법

변경 방법은 간단합니다.

 

use_frameworks! :linkage => :static

해당 내용만 Podfile 처음에 추가해주시면 됩니다.

(dynamic 설정을 원하시면 static을 dynamic으로 변경)

 

참고로 프로젝트 설정에서 Framework 부분을 보면 Embed & Sign / Do not embed / Embed without sign 을 설정하는 부분이 있는데, Static Library는 embed할 필요가 없습니다 
이미 Excutable 파일에 포함되어 있기 때문에 embed 하면 중복으로 파일이 포함되기 때문에 불필요한 용량을 차지할 수 있습니다. (반면 Dynamic Library는 embed 해줘야 합니다)

 

 

 

변경 결과

 

Dynamic Library 로딩 타임은 Edit Scheme -> Run 탭 에서 
DYLD_PRINT_STATISTICS를 추가해줌으로써 확인할 수 있습니다.

해당 변수를 추가하면 이후 빌드시 콘솔 로그에 시간이 찍힙니다.(시뮬레이터는 안 되고, 실제 디바이스만 되는 것 같습니다)

https://www.avanderlee.com/optimization/launch-time-performance-optimization/

 

dylib Loading Time

 

변경 전 : 1.3 ~ 1.5초

변경 후 : 0.4 ~ 0.5초

 

앱 실행 시간 단축에는 확실히 효과가 있었습니다.

다만 이에 따라 얼마나 앱 사이즈가 증가하고 메모리 효율성은 정말로 나빠지는지 체크할 필요가 있겠습니다.

 


(업데이트. 22.07.08)

static Library로 바꾼 후 앱 사이즈를 측정하기 위해서 테스트플라이트에 올려봤습니다.

그런데.... 오히려 앱 사이즈가 줄어들었네요??

 

일반적으로 static library가 dynamic library보다 용량이 많이 나간다고 알려져 있는데, 예상 외의 결과였습니다.

관련해서 static library가 더 용량이 작다는 의견의 글을 찾았는데요.
https://bpoplauschi.github.io/2021/10/25/Advanced-static-vs-dynamic-libraries-and-frameworks.html

 

위 블로거의 주장은

static Library 는 바이너리 파일에 포함되기 때문에 swift compiler optimization에 의해 불필요한 symbol을 최적화 할 수 있다는 것입니다. (반면 dynamic library는 하나의 모듈로 embed 되기 때문에 compiler 최적화 작업이 안 된다고 하네요.)

위 의견도 일리가 있는 것 같네요.
아무튼 결과적으로 저도 static으로 바꾼 후 앱 용량이 줄어드는 효과를 봤습니다.
(해당 내용에 대해서 정확한 사실을 아시는분은 댓글 부탁드립니다!)



* 참고
https://manasaprema04.medium.com/reducing-ios-app-launch-time-pre-main-time-7e9f0c77d24

https://green1229.tistory.com/208

https://ios-development.tistory.com/800

반응형
Comments