Rust (러스트) 릴리스 최적화: 작고 빠른 바이너리 빌드하는 방법

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 (러스트) 프로젝트 컴파일을 위한 최적화 기술입니다.

모두 마스터하셨나요?