デスクトップ アプリのプロファイル誘導最適化

Profile-Guided 最適化 (PGO) は、ランタイム プロファイル データを使用して、より効率的なネイティブ コードを生成するコンパイラ最適化手法です。 PGO を使用すると、コンパイラはアプリの実際の実行方法に基づいてコードを再配置するため、命令キャッシュの使用率が向上し、コード サイズが小さくなり、実行が高速化されます。

Important

デスクトップ Windows アプリ SDK アプリでは、標準の MSVC PGO ワークフローが使用されます。 UWP アプリとは異なり、デスクトップ アプリでは、 pgort140.dll をアプリ パッケージに手動でコピーする必要はありません。PGO ランタイム ライブラリは、標準の C/C++ ランタイムを通じて利用できます。

PGO のしくみ

PGO は、次の 3 つの手順で構成されます。

  1. インストルメンテーション - インストルメンテーションを有効にしてアプリをビルドします。 コンパイラは、コードの実行方法を記録するプローブを挿入します。
  2. プロファイル - インストルメント化されたアプリを実行し、最も重要なシナリオを実行します。 プロファイル データは、 .pgc ファイルに保存されます。
  3. 最適化 - プロファイリング データを使用してアプリをリビルドします。 コンパイラは、実際のランタイム動作に基づいて、コード レイアウト、インライン化、分岐を最適化します。

ステップ バイ ステップ ガイド

1. リリース用に構成する

ソリューション構成を Release (または最適化されたコードを生成する別の構成) に設定します。 PGO は、デバッグ ビルドに適用してもメリットはありません。

2. プログラム全体の最適化を有効にする

プロジェクトのプロパティで、 C/C++>最適化 に移動し、 プログラム全体の最適化 (/GL) が有効になっていることを確認します。

3. ビルドに計測機能を組み込む

リンカー>最適化に移動し、[リンク時間コード生成] を [ガイド付き最適化のプロファイル - インストルメント (/LTCG:PGInstrument)] に設定します。

ソリューションを構築します。 .pgd ファイルがビルド出力と共に生成されます。

4. アプリを実行してプロファイル データを収集する

アプリを実行し、最適化するシナリオ (スタートアップ、ナビゲーション、データ処理、またはパフォーマンスクリティカルなワークフロー) を実行します。 アプリの実行中に、 pgosweep.exe ツール (MSVC ツールセットに含まれる) を使用してプロファイル データを収集します。

pgosweep.exe MyApp.exe MyApp!Scenario1.pgc

さまざまなシナリオで複数の .pgc ファイルを収集できます。

5. プロファイル データをマージする (省略可能)

既定では、.pgc ファイルと共に配置されたすべての.pgd ファイルは、最適化手順中に自動的にマージされます。 特定のシナリオの重みを異なる方法で重み付けするには、 pgomgr.exe ツールを使用します。

pgomgr.exe -merge:3 MyApp!CoreScenario.pgc MyApp.pgd

これにより、 CoreScenario 実行は他の実行の 3 倍の優先度になります。

6. ビルドを最適化する

リンカー>最適化に戻り、リンク時間コード生成プロファイルガイド付き最適化 - 最適化 (/LTCG:PGOptimize) に設定します。

ソリューションをリビルドします。 リンカーは、すべての .pgc ファイルを自動的にマージし、プロファイリング データに基づいて最適化されたバイナリを生成します。

効果的な PGO に関するヒント

  • 現実的なシナリオをプロファイリングします。 PGO 最適化の品質は、プロファイリング実行がどの程度実際の利用状況を代表しているかに左右されます。 ユーザーが実際に通るコードパスを実行します。
  • 複数の実行を結合します。 さまざまな使用シナリオからプロファイリング データを収集して、さまざまなコード パスに対応します。
  • コードが大幅に変更されたときに再プロファイリングします。 コードベースに大きな変更を加えると、プロファイル データが古くなります。 定期的にインストルメント化と再プロファイリングを行います。
  • 影響を測定します。 PGO の前後の起動時間、スループット、メモリ使用量を比較して、最適化の価値を確認します。