Rust (러스트) 릴리스 최적화: 작고 빠른 바이너리 빌드하는 방법
Rust (러스트) 프로젝트 작성을 완료하고 이제 컴파일 작업을 하고 계시는군요.
어떻게 하면 컴파일된 파일을 최대한 작게 만들 수 있을까요?
어떻게 하면 최대한 빠르게 실행되도록 할 수 있을까요?
아니면 어떻게 작은 크기와 빠른 속도 모두를 달성할 수 있을까요?
다음과 같은 고려 사항이 있을 수 있습니다.
파일 크기 최소화: 임베디드 개발에 적합하며, 프로젝트가 작고 복잡하지 않으며 실행 속도는 이미 빠릅니다.
주요 목표는 파일 크기를 최대한 줄이는 것입니다.
실행 속도 최대화: 파일 크기는 중요하지 않지만 동시성을 최대화하는 것이 최우선인 네트워크 서비스에 적합합니다.
크기와 속도 균형: 다양한 유형의 프로젝트에 적합한 중간 지점입니다.Cargo.toml (카고쩜티오엠엘) 파일에 다음 구성을 추가하고 실행하기만 하면 됩니다.
cargo b --release (카고 비 대시릴리스)
구성 예시
더 작은 실행 파일 생성
[profile.release]
opt-level = "z" # 가장 작은 코드 크기로 최적화합니다.
lto = true # 링크 타임 최적화(LTO)를 활성화합니다.
codegen-units = 1 # 코드 생성 유닛 수를 줄여 최적화 시간을 늘리지만 바이너리 크기를 줄입니다.
panic = "abort" # 패닉 처리 시 'unwind' 대신 'abort'를 사용합니다.
strip = "debuginfo" # 디버그 정보를 제거합니다.
더 빠른 실행 파일 생성
[profile.release]
opt-level = 3 # 최대 실행 속도로 최적화합니다.
lto = "fat" # 가장 적극적인 링크 타임 최적화를 활성화합니다.
codegen-units = 1 # 코드 생성 유닛 수를 줄여 최적화 시간을 늘리지만 성능을 향상시킵니다.
panic = "abort" # 패닉 처리 시 'unwind' 대신 'abort'를 사용합니다.
크기와 속도 간의 균형
[profile.release]
opt-level = "s" # 속도를 고려하면서 크기를 최적화합니다.
lto = "fat" # 가장 적극적인 링크 타임 최적화를 활성화합니다.
codegen-units = 1 # 코드 생성 유닛 수를 줄여 최적화 시간을 늘리지만 성능을 향상시킵니다.
panic = "abort" # 패닉 처리 시 'unwind' 대신 'abort'를 사용합니다.
strip = "symbols" # 필요한 디버깅 정보는 유지하면서 심볼 정보를 제거합니다.
구성 설명
opt-level (옵트 레벨)
설명: 컴파일러 최적화 수준을 지정합니다.
가능한 값:
0: 최적화 없음, 가장 빠른 컴파일 시간.1: 더 빠른 컴파일을 위해 최적화합니다.2: 컴파일 속도와 런타임 성능 간의 균형 (기본값).3: 최대 런타임 성능을 위해 최적화합니다."s": 더 작은 코드 크기를 위해 최적화합니다."z": "s"보다 더 적극적으로 코드 크기를 위해 최적화합니다.
이유: 가장 작은 실행 파일을 생성하려면 "z"를 사용하고, 가장 빠른 실행 파일을 생성하려면 3을 사용합니다.
lto (엘티오)
설명: 링크 타임 최적화(LTO)를 활성화합니다.
가능한 값:
false: LTO 비활성화 (기본값).true: LTO 활성화."thin": Thin LTO 활성화."fat": 가장 적극적인 LTO 활성화.
이유: LTO를 활성화하면 바이너리 크기가 줄어들고 런타임 성능이 향상됩니다."thin"은 적당한 선택이며, "fat"은 최상의 최적화를 제공하지만 컴파일 시간이 늘어납니다.
codegen-units (코드젠 유닛츠)
설명: 코드 생성 유닛 수를 제어합니다.
기본값: 보통 16입니다.
1로 설정하면 최고 수준의 최적화가 활성화됩니다.
이유: 코드 생성 유닛 수를 줄이면 컴파일러가 전역 최적화를 위한 더 많은 정보를 얻게 되어 더 작고 빠른 실행 파일을 생성합니다.
1로 설정하면 최적화가 극대화되지만 컴파일 시간이 늘어납니다.
panic (패닉)
설명: 패닉 동작을 제어합니다.
가능한 값:
"unwind": 스택을 해제합니다 (기본값)."abort": 프로세스를 직접 중단합니다.
이유: "abort"를 사용하면 스택 해제 정보가 필요 없어지므로 실행 파일 크기가 줄어들고 경우에 따라 성능이 향상됩니다.
strip (스트립)
설명: 제거할 디버그 및 심볼 정보를 제어합니다.
가능한 값:
"none": 모든 정보를 유지합니다 (기본값)."debuginfo": 디버그 정보를 제거합니다."symbols": 필요한 디버그 정보는 유지하면서 심볼 테이블을 제거합니다."all": 디버그 및 심볼 데이터를 포함한 모든 선택적 정보를 제거합니다.
이유: 불필요한 디버그 및 심볼 정보를 제거하면 실행 파일 크기가 크게 줄어듭니다.
요약
이것이 Rust (러스트) 프로젝트 컴파일을 위한 최적화 기술입니다.
모두 마스터하셨나요?
'Rust' 카테고리의 다른 글
| 러스트(Rust) 메모리 순서의 모든 것: 안전한 동시성 프로그래밍 완전 정복! (0) | 2025.05.20 |
|---|---|
| Rust (러스트) 멀티스레딩 향상: 고급 Arc (아크) 최적화 (0) | 2025.05.17 |
| Rust (러스트)의 매크로와 함수: 언제 무엇을 사용해야 할까요? (0) | 2025.05.17 |
| Go 개발자의 눈으로 본 Rust (4/4): 동시성부터 생태계, 빌드까지 최종 비교 (0) | 2025.04.27 |
| Go 개발자의 눈으로 본 Rust (3/4): 제네릭, 테스트, 모듈 - 재사용성과 구조화의 차이 (0) | 2025.04.27 |