Link fast: Improve build and launch times

정다소·2025년 2월 19일
0

WWDC

목록 보기
4/5

다음 2022 WWDC 영상을 보고 정리한 글 입니다.

https://developer.apple.com/videos/play/wwdc2022/110362/

Linking은 라이브러리나 프레임워크 같은 소스 코드 외의 다른 코드를 연결하여 빌드하는 작업이다. 링킹에는 두가지 타입이 있는데 다음과 같다.

  1. Static Linking : 앱을 빌드할 때 진행되는 연결
  2. Dynami Linking : 앱이 론칭할 때 진행되는 연결

Static Linking

전체 라이브러리 중 필요한 부분만 linking해서 사용함 - > 선택적 로딩

  • 애플의 정적 링커인 ld64 -> 2배 빨라짐 : 코어를 활용해서 병렬로 처리하는 기능을 늘림

정적 라이브러리와 관련해서 빌드 속도를 높이는 법은?

  1. 정적 라이브러리 사용 코드를 변경하면 이 라이브러리 전체를 다시 빌드해야하기 때문에 빌드시간이 오래 걸릴 수 있음. 선택적 로딩은 이러한 링킹 과정을 오래 걸리게 함.( 전통적인 정적 라이브러리의 규약에 따르기 위해 직렬화 된 순서로 빌드해야하기 때문 -> 병렬 방식을 사용하지 못함 )

링크 옵션 :

-all_load
정적 라이브러리를 모두 로딩하여 병렬적으로 링킹해서 속도를 높임

-dead_strip

링킹 불가능한 코드와 데이터를 제거함

-no_exported_symbols

수백만개의 심볼을 제거하면 2~3초가 줄어드는 효과를 본다.
하지만 xctest를 호스트로 사용하는 경우나 일부 앱 플러그인을 사용하는 경우 이 옵션을 사용할 수 없다.

-no_deduplicate

de-dup 최적화를 끈다. 중복을 찾는데 시간이 오래걸리는 알고리즘

build setting에서 other linker flags를 설정해주면 된다.

정적 라이브러리의 놀랄 점

  1. 빌드 된 모든 정적 라이브러리의 코드가 앱에 포함되지 않음 ( 중요하지 않다면)

  2. dead-stripping은 누락된 심볼이나 중복된 심볼 에러를 억제하는 기능이 있음

Dynamic Linking

정적 라이브러리를 실행 가능한 바이너리(dylibs)로 바꾸면서 동적 라이브러리가 시작됨. (90년대 초) DSO또는 DLL이라고 부르기도 함.

위와 같은 방식으로 동적 라이브러리는 프로그램 파일 크기에 포함되지 않으면서 사이즈를 제한할 수 있음. 또 컴파일 시 빌드 시간이 단축된다. 하지만 앱을 시작할 때 더 많은 프로그램을 로드해야하면서 시작 시간이 지연 된다.

동적 라이브러리의 장점은 가상메모리에서 여러 프로세스가 동일한 동적 라이브러리를 사용할 때 이를 공유할 수 있다.

하지만 동적 라이브러리를 연결할 때 또다른 링커가 필요한데 이것이 dyld이다.

-> 정적 라이브러리의 사용과 동적 라이브러리 사용의 중간에서 최적점을 찾아야한다.

Linking 분석 툴

  1. dyld의 동작을 분석함

  1. dyld의 info를 보여준다.

profile
슬기로운 코딩 생활

0개의 댓글