rustc-perf로 프로파일링하기
Rust 벤치마크 스위트는 Rust 컴파일러를 프로파일링하고 벤치마킹하는 포괄적인 방법을 제공합니다. 스위트 사용 방법에 대한 안내는 해당 매뉴얼에서 확인할 수 있습니다.
하지만 스위트를 수동으로 사용하는 것은 다소 번거로울 수 있습니다. rustc 기여자가 이를 더 쉽게 할 수 있도록, 컴파일러 빌드 시스템(bootstrap)은 벤치마킹 스위트와의 내장 통합 기능도 제공합니다. 이 기능은 스위트를 대신 다운로드하고 빌드하며, 로컬 컴파일러 툴체인을 빌드하고, 간소화된 명령줄 인터페이스로 이를 프로파일링할 수 있게 해 줍니다.
이 통합 기능을 사용하려면 ./x perf <command> [options] 명령을 사용하면 됩니다.
이 명령에는 --stage 1이나 --stage 2 같은 일반적인 bootstrap 플래그를 사용할 수 있으며, 이를 통해 예를 들어 생성되는 sysroot의 스테이지를 변경할 수 있습니다. 프로파일링을 더 잘 지원하도록 bootstrap.toml을 설정하는 것도 유용할 수 있습니다. 예를 들어 rust.debuginfo-level = 1을 설정하면 빌드된 컴파일러에 소스 줄 정보가 추가됩니다.
x perf는 현재 다음 명령을 지원합니다:
benchmark <id>: 컴파일러를 벤치마크하고 그 결과를 전달된id아래에 저장합니다.compare <baseline> <modified>: 전달된 두id에 해당하는 두 컴파일러의 벤치마크 결과를 비교합니다.eprintln: 컴파일러를 실행하기만 하고stderr출력을 캡처합니다. 컴파일러는 보통stderr에 아무것도 출력하지 않으므로, 출력을 얻으려면eprintln!호출을 몇 개 추가해야 할 수도 있습니다.samply: samply 샘플링 프로파일러를 사용하여 컴파일러를 프로파일링합니다.cachegrind: Cachegrind를 사용하여 컴파일러 실행에 대한 상세한 시뮬레이션 트레이스를 생성합니다.
프로파일러에 대한 더 자세한 설명은
rustc-perf매뉴얼에서 확인할 수 있습니다.
x perf 명령에는 다음 옵션을 사용할 수 있으며, 이 옵션들은 스위트에서 사용할 수 있는 profile_local 및 bench_local 명령의 해당 옵션과 대응합니다:
--include: 프로파일링/벤치마킹할 벤치마크를 선택합니다.--profiles: 프로파일링/벤치마킹할 프로필(Check,Debug,Opt,Doc)을 선택합니다.--scenarios: 프로파일링/벤치마킹할 시나리오(Full,IncrFull,IncrPatched,IncrUnchanged)를 선택합니다.
외부 크레이트에 대한 프로파일링 diff 예제
외부 크레이트에 대해 컴파일러의 두 커밋 간 로컬 diff를 생성하는 것이 유용할 수 있습니다. 먼저 rustc-perf 저장소에서 다음과 같이 Rust 컴파일러 벤치마크를 실행하는 collector를 빌드하십시오.
cargo build --release -p collector
그런 다음 collector 바이너리를 지정하여 cargo로 collector를 실행할 수 있습니다. 다음 인자를 받습니다.
<PROFILE>: 성능을 어떻게 측정할지 정하는 프로파일러 선택입니다. 이 예제에서는 Cachegrind를 사용하겠습니다.<RUSTC>: 벤치마크할 Rust 컴파일러 리비전으로,rust-lang/rust의 커밋 SHA로 지정합니다. 선택적 인자를 사용하면 위에서 설명한 프로필과 시나리오를 실행할 수 있습니다. 필수 인자와 선택 인자에 관한 자세한 내용은 rustc-perf README의 프로파일러 문서에서 확인할 수 있습니다.
그런 다음 rust-lang/rust 저장소의 두 커밋 <SHA1>과 <SHA2>에 대해 크레이트 serve_derive-1.0.136의 프로필 diff를 생성하려면 rustc-perf 저장소에서 다음을 실행하십시오:
cargo run --release --bin collector profile_local cachegrind +<SHA1> --rustc2 +<SHA2> --exact-match serde_derive-1.0.136 --profiles Check --scenarios IncrUnchanged