プロファイルガイド最適化

プロファイルガイド付き最適化 (PGO) を使用すると、実行可能ファイル全体を最適化できます。 オプティマイザーは、.exe または .dll ファイルのテスト実行からのデータを使用します。 データは、運用環境で予想されるプログラムのパフォーマンスを表します。

SPGO(サンプル プロファイル誘導最適化)は、インストルメンテーションの代わりにハードウェア CPU の Windows Performance Counters を使用する代替アプローチです。 SPGO にはインストルメント化されたビルドは必要ありません。 xperfを使用して、既存のリリース バイナリをプロファイリングします。 詳細については、サンプル プロファイル誘導最適化 (SPGO) チュートリアルを参照してください。

プロファイルガイド付き最適化は、x86、x64、または ARM64 ネイティブ ターゲットでのみ使用できます。 ガイド付き最適化のプロファイルは、共通言語ランタイムで実行する実行可能ファイルでは使用できません。 ネイティブ コードとマネージド コードが混在するアセンブリを生成した場合でも (/clr コンパイラ オプションを使用)、ネイティブ コードのみでガイド付き最適化のプロファイルを使用することはできません。 IDE でこれらのオプション セットを使用してプロジェクトのビルドを試みると、結果としてビルド エラーが発生します。

プロファイリング テストの実行から収集された情報は、 /Ob/Os、または /Ot を指定した場合に有効になる最適化をオーバーライドします。 詳細については、「/Ob (関数のインライン展開)」および「/Os、/Ot (実行可能ファイルのサイズの優先、実行速度の優先)」を参照してください。

アプリを最適化する手順

ガイド付き最適化のプロファイルを使用するには、次の手順に従ってアプリを最適化します。

  • /GL を指定して、1 つ以上のソース コード ファイルをコンパイルします。

    コンパイラは、実行時の動作をキャプチャするために、プロファイルガイド付き最適化テストの実行中に /GL でビルドされた各モジュールを調べます。 /GL を使用して、プロファイルガイド付き最適化ビルド内のすべてのモジュールをコンパイルする必要はありません。 ただし、 /GL でコンパイルされたモジュールのみがインストルメント化され、後でプロファイルガイド付き最適化に使用できます。

  • /LTCG/GENPROFILE または /FASTGENPROFILE を使用してリンクします。

    /LTCG/GENPROFILE または /FASTGENPROFILE の両方を使用すると、インストルメント化されたアプリは実行時に.pgd ファイルを作成します。 テスト実行データを .pgd ファイルに追加した後、それを次のリンク ステップ (最適化されたイメージの作成) への入力として使用できます。 /GENPROFILE を指定する場合は、必要に応じて PGD=filename 引数を追加して、.pgd ファイルの既定以外の名前または場所を指定できます。 /LTCG/GENPROFILE または /FASTGENPROFILE リンカー オプションの組み合わせは、非推奨の /LTCG:PGINSTRUMENT リンカー オプションの代わりに使用します。

  • アプリケーションのプロファイリングを行います。

    プロファイルされた EXE セッションが終了するか、プロファイルされた DLL がアンロードされるたびに、プロセスによって appname!N.pgc ファイルが作成されます。 .pgc ファイルには、特定のアプリケーションのテスト実行に関する情報が含まれます。 appname はアプリの名前で、 N は 1 から始まる番号です。 ディレクトリ内の他の appname!N.pgc ファイルの数に基づいてインクリメントされます。 .pgc ファイルは、最適化したいシナリオがそのテスト実行で表されない場合、削除できます。

    テストの実行中に、.pgc ユーティリティを使用して、現在開いている.pgc ファイルのクローズと新しい ファイルの作成を強制できます (たとえば、テスト シナリオの終了がアプリケーションのシャットダウンと一致しない場合など)。

    アプリケーションで PGO 関数 PgoAutoSweep を直接呼び出して、呼び出しの時点のプロファイル データを .pgc ファイルとしてキャプチャすることもできます。 これにより、.pgc ファイル内のキャプチャされたデータの対象となるコードをより細かく制御できるようになります。 この関数の使用方法を示す例については、PgoAutoSweep のドキュメントを参照してください。

    インストルメント化されたビルドを作成する場合、既定では、データ収集は、非スレッドセーフ モードで実行されます。これは高速ですが、不正確な場合があります。 /GENPROFILE または /FASTGENPROFILEEXACT 引数を使用すると、スレッドセーフ モードでのデータ収集を指定できます。その場合、精度は高くなりますが、速度は低下します。 このオプションは、インストルメント化されたビルドを作成するときに、非推奨の PogoSafeMode 環境変数または非推奨の /POGOSAFEMODE リンカー オプションを設定する場合にも使用できます。

  • /LTCG/USEPROFILE を使用してリンクします。

    /LTCG/USEPROFILE の両方のリンカー オプションを使用して、最適化されたイメージを作成します。 この手順では、 .pgd ファイルを入力として受け取ります。 /USEPROFILE を指定する場合は、必要に応じて PGD=filename 引数を追加して、.pgd ファイルの既定以外の名前または場所を指定できます。 また、非推奨の /PGD リンカー オプションを使用して、この名前を指定することもできます。 /LTCG リンカー オプションと /USEPROFILE リンカー オプションの組み合わせにより、非推奨の /LTCG:PGOPTIMIZE および /LTCG:PGUPDATE リンカー オプションが置き換えられます。

最適化された実行可能ファイルを作成し、後で、より最適化されたイメージを作成するためにより多くのプロファイリングが役立つと判断することもできます。 インストルメント化されたイメージとその.pgd ファイルが使用可能な場合は、同じ .pgd リンカー オプションと /USEPROFILE リンカー オプションを使用して、より多くのテスト実行を実行し、新しい ファイルで最適化されたイメージを再構築できます。

.pgc および .pgd ファイルの種類はどちらも、バイナリ ファイルです。 ソース管理システムに格納する場合は、テキスト ファイルに対して自動変換を行わないようにします。

PGO で実行される最適化

プロファイルガイド付き最適化には、次のチェックと改善が含まれます。

  • インライン化 - たとえば、関数 A が関数 B を頻繁に呼び出し、関数 B が比較的小さい場合、プロファイルガイド付き最適化では、関数 A のインライン関数 B が最適化されます。

  • 仮想呼び出し推理 - 仮想呼び出し、または関数ポインターからのその他の呼び出しが特定の関数を頻繁に呼び出す場合、ガイド付き最適化のプロファイルにより、頻繁に呼び出される関数に条件付きで実行される直接呼び出しを挿入し、その直接呼び出しをインライン展開できます。

  • レジスタ割り当て - プロファイル データに基づいた最適化により、レジスタの割り当てが改善されます。

  • 基本ブロックの最適化 - 基本ブロックの最適化を行うと、一般的に実行され、特定のフレーム内で一時的に実行される基本ブロックを同じページ セット (ローカリティ) に配置できます。 これにより、使用されるページ数が最小限に抑えられるため、メモリのオーバーヘッドも最小限に抑えられます。

  • サイズ/速度の最適化 - プログラムで最も多くの実行時間が費やされる関数の速度を最適化できます。

  • 関数のレイアウト - コールグラフおよびプロファイルされた呼び出し元/呼び出し先の動作に基づいて、同じ実行パスになる傾向のある関数が同じセクション内に配置されます。

  • 条件付き分岐の最適化 - ガイド付き最適化のプロファイルにより、値プローブを使用して、switch ステートメント内の特定の値が他の値よりも頻繁に使用されているかどうかを確認できます。 この値は switch ステートメントから取得できます。 同じ最適化は、 if...else 命令を使用して実行できます。オプティマイザーは、 if...else を順序付けして、 if または else ブロックが最初に配置されるようにします。これは、どのブロックがより頻繁に当てはまるかに応じて行われます。

  • デッド コード分離 - プロファイルガイド付き最適化では、プロファイル中に呼び出されないコードが、セクション セットの最後にある特別なセクションに移動されます。 これにより、頻繁に使用されるページからこのセクションが切り離されます。

  • EH コードの分離 - EH コードは例外的に実行されるだけなので、多くの場合、個別のセクションに移動できます。 プロファイルガイド付き最適化は、例外が例外条件でのみ発生すると判断したときに移動します。

  • メモリイントリンシック - イントリンシックを展開するかどうかは、それが頻繁に呼び出されるかどうかによって決まります。 内部機能は、移動またはコピーのブロックサイズに基づいて最適化することもできます。

次のステップ

プロファイルガイド付き最適化で使用できるこれらの環境変数、関数、およびツールの詳細については、次のリソースを参照してください。

ガイド付き最適化のプロファイルの環境変数
これらの変数は、テスト シナリオの実行時の動作を指定します。 これらは非推奨となり、新しいリンカー オプションに置き換えられています。 このドキュメントでは、環境変数からリンカー オプションに移行する方法を示します。

PgoAutoSweep
.pgc ファイルのデータ キャプチャをきめ細かに制御するためにアプリに追加できる関数。

pgosweep
すべてのプロファイル データを .pgc ファイルに書き込んで、.pgc ファイルを閉じ、新しい .pgc ファイルを開くコマンドライン ユーティリティ。

pgomgr
1 つ以上の .pgc ファイルのプロファイル データを .pgd ファイルに追加するコマンドライン ユーティリティ。

方法: 複数の PGO プロファイルを 1 つのプロファイルにマージする
pgomgr の使用例。

サンプル プロファイル誘導最適化 (SPGO) チュートリアル
インストルメンテーションの代わりに CPU ハードウェア パフォーマンス カウンターを使用します。 インストルメント化されたビルドは必要ありません。 xperfを使用して既存のリリース バイナリをプロファイリングします。

関連項目

追加の MSVC ビルド ツール