[Rust] 실행파일 크기 줄이기
일반적인 경우는 아니지만, 종종 극단적인 환경에서는 바이너리 크기로 제한을 받을 경우가 있다.
그럴때는 실행성능을 조금 포기하더라도 사이즈를 줄여야할 필요가 있다.
여기서는 컴파일 설정을 통해 사이즈를 줄이는 방법은 간략하게 다뤄보겠다.
테스트에 사용한건 내가 개인프로젝트로 작업중인건데, 소스가 꽤 많고 종속성이 10개 정도 됐다.
기본값으로 빌드를 사용한다면

3890176, 3.8메가바이트 정도가 나왔다.
이걸 이게 단계적으로 줄여보겠다.
릴리즈 빌드
가장 먼저 해야할건 릴리즈모드로 빌드를 하는 것이다.
릴리즈 옵션을 주지 않는다면 cargo는 디버그 모드로 빌드를 처리한다.
디버그 모드는 오로지 빠른 빌드와 디버깅을 주 목적으로 해서, 실행성능이나 바이너리 사이즈 등은 고려하지 않는다.
그래서 릴리즈 모드로 전환만 해도 꽤나 큰 성능향상을 볼 수가 있다.

이번엔 1295872바이트, 1.2메가바이트가 나왔다.
무려 3배가 넘는 압축률이다!
사이즈 최적화 옵션
저걸로도 부족하다면, 사이즈 최적화 옵션을 주면 된다.
이러면 실행성능을 좀 포기하더라도 사이즈를 줄이는 방향으로 최적화를 하게 된다.
toml에 아래 설정값을 추가해서 빌드한다.

[profile.release]
opt-level = "z"
그렇게 돌리면
이번엔 1132032바이트, 1.2메가바이트가 나왔다.
아까처럼 극적이지는 않지만, 줄긴 줄었다.
링크타임 최적화
더 줄여보자.
link time optimization이라는 옵션이 있다.
링크타임에 할수있는 최적화를 추가적으로 또 하는 것이다.
사이즈 최적화 모드가 아니라면 이걸 켜도 오히려 사이즈를 키우고 실행성능을 높이는 방향이 될 수 있지만, 사이즈 최적화 모드에서는 조금 더 줄여줄 수 있는 방법이 된다.

[profile.release]
opt-level = "z"
lto = true
그럼 이렇게 더 줄어든 것을 볼 수 있다.
914432바이트. 914킬로바이트다!
병렬처리 끄기
llvm은 여러개의 코어를 사용하는 병렬 컴파일을 지원하고, rust 컴파일러 또한 이를 적극 활용하는듯하다.
병렬컴파일을 사용하면 컴파일은 훨씬 빠르게 처리할 수 있지만, 각 코어가 담당한 영역 이상을 서로 침범하기 힘들기 때문인지, 최적화 자체에는 좀 불리함이 생긴다.
그래서 컴파일 코어 단위를 1로 제한하면 컴파일은 느려지지만 결과물은 더 작고 빨라질 수도 있다.
옵션은 이렇게 주면 된다.

[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
그리고 돌리면
869885바이트, 869킬로바이트가 나왔다.
처음의 3.8메가바이트에 비하면 꽤나 극적인 변화라고 할만하다.