rustc-perf によるプロファイリング
Rust benchmark suite は、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>: 渡された 2 つのidを持つ 2 つのコンパイラのベンチマーク結果を比較します。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)を選択します。
外部クレート向けプロファイリング差分の例
外部クレートに対して、コンパイラの 2 つのコミットのローカル差分を生成することに関心があるかもしれません。
まず、rustc-perf リポジトリで、Rust コンパイラのベンチマークを実行する collector を次のようにビルドします。
cargo build --release -p collector
その後、collector バイナリを指定して、cargo を使用して collector を実行できます。 これは次の引数を想定しています。
<PROFILE>: パフォーマンスをどのように測定すべきかを表すプロファイラの選択。 この例では、Cachegrind を使用します。<RUSTC>: ベンチマーク対象の Rust コンパイラのリビジョンで、rust-lang/rustのコミット SHA として指定します。 任意引数により、上記のようにプロファイルとシナリオを実行できます。 必須引数および任意引数に関する詳細は、rustc-perf-readme-profilers にあります。
次に、rust-lang/rust リポジトリの 2 つのコミット <SHA1> と <SHA2> について、クレート serve_derive-1.0.136 のプロファイル差分を生成する場合は、
rustc-perf リポジトリで次を実行します。
cargo run --release --bin collector profile_local cachegrind +<SHA1> --rustc2 +<SHA2> --exact-match serde_derive-1.0.136 --profiles Check --scenarios IncrUnchanged