메타데이터를 일찍 출력하면 Rust 빌드와 검사가 최대 두 배 빨라짐

3 hours ago 5

headstart는 의존 크레이트의 인터페이스 검사가 끝나면 메타데이터를 먼저 출력해, 함수 본문 검사가 끝나기 전에 후속 크레이트의 컴파일을 시작하게 함 cargo check 는 초기 메타데이터만으로 검사를 완료하며, cargo build 는 분석을 먼저 수행한 뒤 코드 생성 전에 완전한 메타데이터를 기다림 16코어에서 실제 프로젝트 13개의 클린 작업을 측정한 결과, cargo check는 최대 54%, cargo build는 최대 42% 빨라졌으며 느려진 프로젝트는 없었음 성능 향상은 빌드 중 놀던 코어를 활용하는 데서 나오므로 코어 수가 적으면 효과가 줄어듦. 4코어에서 rust-analyzer 검사는 24%, 빌드는 13~15% 빨라짐 함수 본문에 오류가 있으면 기존과 같은 진단 및 종료 상태로 실패하지만, 폐기되는 후속 작업, 다소 늦어지는 오류 보고, 동시 메모리 사용량 증가라는 비용이 있음 의존성 검사를 겹쳐 실행하는 방식 기존에는 각 크레이트가 의존 크레이트의 함수 본문까지 모두 검사될 때까지 기다림 후속 크레이트가 자신의 타입을 검사하는 데 필요한 것은 의존 크레이트의 함수 본문이 아니라 .rmeta 파일에 담긴 인터페이스임 headstart는 인터페이스 검사가 끝나는 즉시 초기 메타데이터를 기록하고, 이를 받은 후속 크레이트를 시작함 의존 크레이트의 본문 검사와 후속 크레이트의 컴파일이 겹쳐 실행됨 검사와 빌드의 대기 시점이 다름 cargo check는 초기 메타데이터로 끝까지 실행됨 cargo build는 초기 메타데이터로 모든 분석을 수행한 뒤, 코드 생성 전에 완전한 메타데이터를 기다림 대기 중인 컴파일은 작업 슬롯을 반환해 다른 작업이 실행될 수 있게 함 rustc와 Cargo 패치 구성 rustc의 -Zearly-metadata 는 패치 6개로 구성됨 새 analysis_interfaces 쿼리가 분석을 항목 인터페이스와 함수 본문으로 분리함 드라이버가 두 분석 단계 사이에 .early-rmeta를 기록함 크레이트 로딩은 초기 메타데이터를 허용하고, 코드 생성 전에 완전한 메타데이터로 교체함 필요하면 메타데이터 생성 측이 기록 완료까지 유지하는 잠금을 통해 대기함 Cargo의 -Zheadstart 는 패치 3개로 구성됨 모든 컴파일에 -Zearly-metadata를 전달하고, check와 build 모두에서 초기 메타데이터 알림을 받으면 후속 크레이트를 시작함 일시 중단된 컴파일의 ...

Read Entire Article