러스트 컴파일 속도 2배까지 단축하는 '조기 메타데이터' 기법
원제 Emitting metadata early makes building/checking Rust up to twice as fast
110 포인트댓글 30
Key Point
러스트 컴파일 속도가 실무 프로젝트에서 최대 54% 개선되는 구체적인 기법이며, 패치 형태로 제공되어 업스트림 통합 가능성을 보여준다.
핵심 요약
- Headstart는 의존 크레이트가 타입 체크를 완료한 직후 인터페이스 메타데이터(.rmeta)를 조기에 생성하고, 의존하는 크레이트들이 함수 본체 체크가 완료되기 전에 이 메타데이터로 컴파일을 시작하게 한다.
- cargo check에서는 의존 크레이트의 조기 메타데이터로 다운스트림 크레이트들이 완료될 때까지 진행되고, cargo build에서는 분석 단계는 조기 메타데이터로 진행 후 코드 생성 전에 완전한 메타데이터를 기다리며, 대기 중 작업 슬롯을 다른 작업에 양보한다.
- 에러가 발생하면 기존과 동일한 진단과 종료 상태로 실패하며, 비용은 버려지는 다운스트림 작업, 약간 늦어진 에러 보고, 동시 메모리 사용량 증가이다.
- rustc에 -Zearly-metadata 플래그(6개 패치)를 추가해 분석을 아이템 인터페이스와 함수 본체로 분리하고, 드라이버가 둘 사이에 .early-rmeta를 작성하며, 크레이트 로딩이 조기 메타데이터를 받아들이고 코드 생성 전 완전한 메타데이터로 교체한다.
- cargo에 -Zheadstart 플래그(3개 패치)를 추가해 모든 컴파일에 -Zearly-metadata를 전달하고, 조기 메타데이터 알림으로 의존 크레이트를 시작하며, 일시 중지된 컴파일의 작업 슬롯을 다른 작업에 제공하고, 의존성이 성공한 후에만 크레이트의 출력을 보고한다.
- 기본 프론트엔드에서 13개 실제 프로젝트(rust-analyzer, zed, bevy, lemmy, polars 등)의 깨끗한 빌드가 cargo check에서 최대 54%, cargo build에서 최대 42% 빨라졌으며, 병렬 프론트엔드(-Zthreads=8)에서는 최대 25% 추가 개선을 보인다.
- 16코어 기준 성능 향상이며, 4코어에서는 rust-analyzer의 check가 24%, build가 13~15% 빨라지고, codex-rs의 check가 14% 개선되며, 광범위 빌드는 동등한 수준이다.
- codex-rs의 깨끗한 cargo build 16코어 기준에서 조기 메타데이터 없을 때는 워크스페이스 크레이트들이 순차 컴파일되며 머신이 대부분 유휴 상태이지만, 적용 시 각 크레이트가 이전 크레이트의 조기 메타데이터에서 시작되어 37% 빠르다.
- 시간 축과 의존성 깊이 시각화에서 조기 메타데이터 미적용 시 워크스페이스 크레이트들이 긴 계단식 구조를 형성하지만, 적용 시 크레이트들이 겹치는 병렬 구조로 변한다.
- 패치들은 커밋 메시지와 테스트를 포함한 커밋 시리즈로 구성되어 있으며 업스트림 풀 리퀘스트가 되도록 의도되었고, 문서에서 설계, 결과, 준비 상태를 설명한다.
- scripts/setup.sh로 rustc와 cargo를 체크아웃한 후 패치를 적용하고 빌드하며, RUSTC 환경 변수나 CARGO_UNSTABLE_HEADSTART 플래그 또는 .cargo/config.toml 설정으로 활성화한다.
- 테스트 스크립트들이 smoke 워크스페이스(조기 메타데이터 효과 표시), 에러 처리 검증, 증분 편집 시나리오, 메타데이터 교체 검증, rustc-perf 컴파일 벤치마크 검증(-Zearly-metadata-verify 포함)을 수행한다.
- 벤치마크 스크립트는 깨끗한 빌드의 중앙값을 측정하고, 실제 프로젝트 13개와 codex-rs를 테스트하며, 전체 벤치마크 스위트를 실행할 수 있고, 메모리 사용량 및 증분 재검사 시간도 측정한다.