チュートリアル : Profile-Guided Optimizations の使用
このチュートリアルでは、さまざまなシナリオに対して PGO (ガイド付き最適化のプロファイル) を使用する方法を示します。シナリオは、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) における PGO のビルド メニューを使用した単純な実装から、カスタム構成を必要とする高度なシナリオまでさまざまです。 また、このチュートリアルでは、プロファイル データを収集およびマージするプロセスを PGO コマンド ライン ツールを使用してカスタマイズできる高度な技法についても説明します。 概要については、「ガイド付き最適化のプロファイル」を参照してください。
PGO を使用したアプリケーションのビルド
この例のシナリオでは、PGO を使用して単純なアプリケーションをビルドする方法を示します。
IDE で PGO を使用するビルド
PGO は、すべてのネイティブ Visual C++ プロジェクトに適用できます。 次の手順では、Win32 アプリケーションで PGO を使用する方法について説明します。
Win32 プロジェクトを作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] ペインの [Visual C++] ノードを選択し、[テンプレート] ペインの [Win32 プロジェクト] を選択します。
[プロジェクト名] ボックスに「PGODemo」と入力します。
[OK] をクリックします。 Win32 アプリケーション ウィザードが表示されます。
既定の設定をすべてそのまま使用します。 [完了] をクリックします。
PGO を使用して PGODemo プロジェクトをビルドするには
[標準] ツール バーの [ソリューション構成] ボックスをクリックし、[Release] 構成を選択します。
ソリューション エクスプローラーで、PGODemo プロジェクト ノードを右クリックします。 プロジェクトのコンテキスト メニューで、[ガイド付き最適化のプロファイル] を選択し、[インストルメント] メニュー項目を選択します。
ソリューション エクスプローラーで、PGODemo プロジェクト ノードを右クリックします。 プロジェクトのコンテキスト メニューで、[ガイド付き最適化のプロファイル] を選択し、[インストルメントまたは最適化されたアプリケーションの実行] を選択してアプリケーションを起動します。
注意
[デバッグ] メニューの [デバッグ開始] または [デバッグなしで開始] を選択して、インストルメント アプリケーションを起動することもできます。
別のシナリオを使用して実装されたインストルメント アプリケーションを試験実行するには、手順 3. を繰り返します。 インストルメント アプリケーションがシャットダウンすると、.PGC ファイルがプロジェクトの出力ディレクトリに作成され、実行の対象となったプロファイル データが格納されます。
ソリューション エクスプローラーで、PGODemo プロジェクト ノードを右クリックします。 プロジェクトのコンテキスト メニューの [ガイド付き最適化のプロファイル] を選択し、[最適化] を選択します。
コマンド ラインで PGO を使用したビルド
PGO の最適化を使用して myapp.exe アプリケーションを S1 から Sn までのソース ファイルからビルドすると仮定します。 最初の手順は、/GL コンパイラ オプションを使用して S1 から Sn までのソースをコンパイルすることです。
また、必要に応じて最適化オプションを指定する必要もあります。たとえば、/O2 オプションを選択するとします。 PGO を使用してアプリケーションをビルドする際に最適化オプションを使用しない (つまり、 /Od を使用する) と、警告が発生し、コンパイラは LTCG 用にビルドするように自動的に切り替えられます。 コマンド ラインを使用する場合、最初の手順は次のようになります。
/GL を使用してソース ファイルをコンパイルするには
cl.exe /c /GL /O2 S1.cpp … Sn.cpp
link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe
手順 2. では、PGO でインストルメント化されたイメージ myapp.exe が作成され、最後に最適化された myapp.exe をビルドする際にコンパイラによって使用されるプロファイル データベース ファイルである myapp.pgd も作成されます。 .pgd ファイルの既定の名前はアプリケーションの名前で、既定のパスは出力パスです。
前の手順で /pgd リンカー オプションを使用すると、アプリケーション用に生成された .pgd ファイルの既定の名前を変更できます。 /pgd は次のように使用できます。
/LTCG:PGI および /PGD を使用してインストルメント化されたイメージを作成するには
- link /ltcg:pgi /pgd:mypgd.pgd S1.obj … Sn.obj /out:myapp.exe
これで、プロファイリングのシナリオを使用して、インストルメント化された myapp.exe を試験実行する準備ができました。 シナリオを実行し終えると、そのたびに .pgc ファイルが作成されることがわかります。
注意
myapp.exe の複数のイメージを同じパスから同時に実行すると、すべてのイメージに対して .pgc ファイルが 1 つだけ作成されます。このファイルは、すべてのインスタンスが終了しないと、ディスクに書き込まれません。
注意
.pgc ファイルの既定のパスは実行可能ファイルのパスです。このパスを変更するには、プロファイリングのシナリオを実行する前に VCPROFILE_PATH 環境変数を設定します。つまり、VCPROFILE_PATH=<some path> を設定してから、インストルメント化されたイメージの myapp.exe を実行します。
PGO で最適化された myapp.exe をビルドする準備ができました。
/LTCG:PGO および /PGD を使用して最適化されたイメージを作成するには
- link /ltcg:pgo /pgd:mypgd.pgd S1.obj … Sn.obj /out:myapp.exe
注意
手順 1. を実行する前に、シナリオの試験実行中にプロファイル データベース ファイル (.PGD) と同じフォルダー内に作成された、すべての .PGC ファイルを持っている必要があります。
カスタム プロファイル データのマージ
アプリケーションに主要な顧客のシナリオが 2 つあると仮定しましょう。 1 つ目のシナリオは、2 つ目のシナリオの 2 倍重要であり、顧客によって頻繁に実行されています。
以下の手順では、Visual Studio 開発環境およびコマンド ライン ツールを使用して、プロファイル データを .PGD ファイルにマージする際にそのデータのウェイトを高くする方法について説明します。
IDE におけるプロファイル データのマージ
Win32 プロジェクトを作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] ペインの [Visual C++] ノードを選択し、[テンプレート] ペインの [Win32 プロジェクト] を選択します。
[プロジェクト名] ボックスに「PGODemo」と入力します。
[OK] をクリックします。 Win32 アプリケーション ウィザードが表示されます。
既定の設定をすべてそのまま使用します。 [完了] をクリックします。
IDE でマージしたプロファイル データを使用して PGODemo プロジェクトをビルドするには
[標準] ツール バーの [ソリューション構成] ボックスをクリックし、[Release] 構成を選択します。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 ショートカット メニューの [ガイド付き最適化のプロファイル] をクリックし、[インストルメント] をクリックします。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 ショートカット メニューの [ガイド付き最適化のプロファイル] をクリックし、[インストルメント アプリケーションの実行] をクリックします。 これにより、アプリケーションが起動します。 通常、[デバッグ] メニューの [開始] または [デバッグなしで開始] を使用して、インストルメント アプリケーションを起動することもできます。
手順 3. を 2 回 (各顧客のシナリオに 1 回ずつ) 繰り返します。 この手順では、出力ディレクトリに 2 つの .PGC ファイル (PGODemo!1.pgc および PGODemo!2.pgc) が作成されます。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 [プロパティ] をクリックすると、[PGODemo] プロパティ ページのダイアログ ボックスが表示されます。
[構成プロパティ] の [ビルド イベント] をクリックし、[リンク前のイベント] をクリックします。 コマンド ラインに、次のコマンドを入力します。
"$(VCInstallDir)bin\pgomgr.exe" -merge:2 $(OutDir)\$(ProjectName)!1.pgc $(OutDir)\$(ProjectName).pgd
注意
この手順では、pgomgr.exe を使用して別の手順で PGODemo!1.pgc をマージした後、リンカーを起動して、最後に最適化されたアプリケーションをビルドします。このリンカーは、次の手順の実行中に pgomgr.exe を再度呼び出し、PGODemo!2.pgc ファイルをマージしますが、既定のウェイトは 1 です。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 ショートカット メニューの [ガイド付き最適化のプロファイル] をクリックし、[最適化] をクリックします。
コマンド ラインからのプロファイル データのマージ
コマンド ライン ツールを使用し、次のようにカスタム プロファイル データをマージできます。
マージしたプロファイル データをコマンド ラインからビルドするには
cl.exe /c /GL /O2 S1.cpp … Sn.cpp
link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe
上記の 2 つの手順により、インストルメント化された myapp.exe が作成されます。
2 つの異なるシナリオを使用してインストルメント化された myapp.exe を試験実行すると、2 つの異なる .PGC ファイル (myapp!1.pgc および myapp!2.pgc) が作成されます。
最初のシナリオのウェイトを高くするには、次のように pgomgr.exe を使用します。
Pgomgr –merge:2 myapp!1.pgc myapp.pgd
次のように、リンク コマンドを実行し、最後に最適化されたアプリケーションを作成します。
link /ltcg:pgo /pgd:myapp.pgd /out:myapp.exe
これにより、既定のウェイトの 1 で myapp!2.pgc がマージされます。
PGO の更新
上記の 2 つのシナリオでは、インストルメント アプリケーションをビルドして試験実行した後、/ltcg:pgo リンカー オプションを使用して、最後に最適化されたアプリケーションをビルドしました。 /ltcg:pgo オプションを使用すると、リンカーによって、インストルメント アプリケーションのビルドに使用される入力ファイル (オブジェクト ファイル、ライブラリなど) に変更が加えられていないことを確認するためのチェックが行われます。 つまり、/ltcg:pgo を使用するには、リンカーに渡されたすべての入力ファイルが /ltcg:pgi による手順で渡されたファイルと同じである必要があります。
これは、インストルメント アプリケーションおよび .PGD ファイルをビルドした後にソースが偶発的に変更されると、PGO によるコードの生成と最適化の決定に大きな影響を与える可能性があるためです。
インストルメント アプリケーションをビルドし、プロファイル データを作成して、PGO で最適化されたアプリケーションをビルドした後、アプリケーションのバージョン番号の更新を忘れたことに気付いた、またはアプリケーションのフローにあまり影響しない、少しだけ修正が必要な小さなバグが見つかったとします。 このシナリオには、/ltcg:pgu オプションが用意されています。 このオプションを使用すると、/ltcg:pgo オプションの使用時にリンカーによるチェックは実行されません。 PGI ビルドと PGU ビルドの間では、ファイルを編集および再コンパイルするだけでなく、新しいファイルをアプリケーションに追加することもできます。
以下の手順では、Visual Studio 開発環境とコマンド ライン ツールを使用して /ltcg:pgu オプションを使用する方法について説明します。
IDE における更新
IDE で /LTCG:PGU を使用して PGODemo をビルドするには
[標準] ツール バーの [ソリューション構成] ボックスをクリックし、[Release] 構成を選択します。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 ショートカット メニューの [ガイド付き最適化のプロファイル] をクリックし、[インストルメント] をクリックします。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 ショートカット メニューの [ガイド付き最適化のプロファイル] をクリックし、[インストルメントまたは最適化されたアプリケーションの実行] をクリックします。 これにより、アプリケーションが起動します。 通常、[デバッグ] メニューの [デバッグ開始] または [デバッグなしで開始] を使用して、インストルメント アプリケーションを起動することもできます。
この手順では、ソース ファイルに変更を適用できます。 既に説明したように、アプリケーションの動作に大きく影響する変更が原因で、パフォーマンスが大幅に低下する場合があります。 通常は、小さなバグの修正やリソース ファイルの変更など、少しだけ変更を加えます。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 ショートカット メニューの [ガイド付き最適化のプロファイル] をクリックし、[更新] をクリックします。 これにより、変更されたファイルだけが再コンパイルされ、/ltcg:pgo オプションではなく –/ltcg:pgu オプションでリンカーが起動されるため、編集したファイルを使用できます。
注意
プロファイル データを含まない新しい関数、および試験実行の手順で収集したプロファイル データを無効にすることで編集された関数のそれぞれに対して警告が発生します。[標準] ツール バーの [ソリューション構成] ボックスをクリックし、[Release] 構成を選択します。
注意
手順 5. のときに、ソリューション エクスプローラーで、変更したソース ファイルを右クリックし、[コンパイル] をクリックすると、出力フォルダー内の PGO 関連のファイルがすべて削除されます。これは、PGO ビルドから通常のビルドに移行する際にプロジェクト システムでクリーン ビルドが実行されるためです。
コマンド ラインでの更新
次のように、コマンド ライン ツールを使用して、PGO を更新できます。
コマンド ラインで /LTCG:PGU を使用してビルドするには
cl.exe /c /GL /O2 S1.cpp … Sn.cpp
link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe
上記の 2 つの手順により、インストルメント化された myapp.exe が作成されます。
インストルメント化された myapp.exe を試験実行します。
link /ltcg:pgo /pgd:myapp.pgd /out:myapp.exe
手順 4. では、最適化された myapp.exe が作成されます。 Sm.cpp に小さなバグが見つかった場合、次のように、修正を適用して、Sm.cpp だけをコンパイルできます。
cl /c /GL /O2 Sm.cpp
次に、/ltcg:pgu を使用し、手順 3. で作成された古いプロファイル データを使用して、最適化されたアプリケーションをビルドします。
link /ltcg:pgu /pgd:myapp.pgd /out:myapp.exe
カスタム PGO 構成
このシナリオでは、カスタム PGO 構成を作成し、複数のプロジェクトを含むソリューションをビルドする方法について説明します。 このシナリオでは、DLL をソリューションに追加し、PGODemo アプリケーションにリンクさせます。 2 つの構成 (PGIRelease と PGORelease) を作成し、[ガイド付き最適化のプロファイル] のメニュー項目を使用して各製品を 1 つずつビルドするのではなく、これらの構成を使用してソリューション全体をビルドします。
カスタム PGO 構成を作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] ペインの [Visual C++] ノードを選択し、[テンプレート] ペインの [Win32 プロジェクト] を選択します。
[プロジェクト名] ボックスに「PGODemo」と入力します。
[OK] をクリックします。 Win32 アプリケーション ウィザードが表示されます。
既定の設定をすべてそのまま使用します。 [完了] をクリックします。
PGODemo という名前のソリューションとプロジェクトが作成されます。 次に、DLL プロジェクトを作成します。
ソリューション エクスプローラーで、ソリューションを右クリックし、[追加] を選択します。 次に、[新しいプロジェクト] をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] ペインの [Visual C++] ノードを選択し、[テンプレート] ペインの [Win32 プロジェクト] を選択します。
[プロジェクト名] ボックスに「PGODemoDLL」と入力します。
[OK] をクリックします。 Win32 アプリケーション ウィザードが表示されます。
[アプリケーションの設定] ページで、アプリケーションの種類として [DLL アプリケーション] を選択し、[完了] をクリックします。
PGODemoDLL という名前の DLL プロジェクトが作成されます。
ソリューション エクスプローラーで、PGODemoDLL プロジェクトをダブルクリックします。PGODemoDLL.cpp をダブルクリックし、次のコードを追加します。
__declspec(dllexport) void HelloMessage(void) { MessageBox(NULL, L"hello", L"PGODemoDLL", MB_OK); }
ソリューション エクスプローラーで、PGODemo プロジェクトをダブルクリックします。PGODemo.cpp をダブルクリックし、_tWinMain 関数の定義の前に次の宣言を追加します。
__declspec(dllimport) void HelloMessage(void);
_tWinMain のメイン メッセージ ループの前に、次のコードを追加します。
HelloMessage();
ソリューション エクスプローラーで、PDODemo ソリューションを右クリックし、[プロジェクト依存関係] をクリックします。 [プロジェクトの依存関係] ダイアログ ボックスが表示されます。
[依存関係] ページの [プロジェクト] ボックスで、選択した PGODemo をクリックします。 [依存先] ボックスの一覧の PGODemoDLL のチェック ボックスをオンにします。
次に、PGIRelease 構成と PGORelease 構成を作成します。
ソリューション エクスプローラーで、ソリューションを右クリックし、[構成マネージャー] をクリックします。 PGODemo プロジェクトの [構成] ボックスをクリックし、[<新規作成...>] をクリックします。 [新しいプロジェクト構成] ダイアログ ボックスが表示されます。
[プロジェクト構成名] ボックスに「PGIRelease」と入力し、[設定のコピー元] ボックスの [Release] を選択します。 [新しいソリューション構成を作成する] チェック ボックスがオンになっていることを確認します。
PGODemoDLL プロジェクトで同じ手順を繰り返し、PGIRelease 構成をこのプロジェクトに追加します。 この場合は [新しいソリューション構成を作成する] チェック ボックスがオフになっていることを確認します。
両方のプロジェクトに対して手順 16. を繰り返し、PGORelease 構成を作成します。 設定も [Release] 構成からコピーされることを確認します。 [構成マネージャー] ダイアログ ボックスを閉じます。
PGIRelease および PGORelease という 2 つの構成が作成されました。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックし、[プロパティ] をクリックします。 [構成] ボックスの [PGIRelease] 構成を選択します。 [構成プロパティ] の [全般] をクリックします。 [プログラム全体の最適化] ボックスをクリックし、[ガイド付き最適化のプロファイル - インストルメント] オプションを選択します。 [適用] をクリックし、変更内容を保存します。
[構成] ボックスの [PGORelease] 構成を選択します。 [構成プロパティ] の [全般] をクリックします。 [プログラム全体の最適化] ボックスをクリックし、[ガイド付き最適化のプロファイル - 最適化] を選択します。 [適用] をクリックし、変更内容を保存します。
PGODemoDLL プロジェクトの PGIRelease 構成および PGORelease 構成に対して、手順 18. を繰り返します。
両方のプロジェクトで、PGORelease 構成の [中間ディレクトリ] を変更し、PGIRelease 構成の [出力ディレクトリ] と同じにします。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックし、[プロパティ] をクリックします。 [構成] ボックスの [PGORelease] 構成を選択します。 [構成プロパティ] の [全般] をクリックします。 [中間ディレクトリ] に「$(SolutionDir)PGIRelease」と入力します。 [適用] をクリックしてダイアログを閉じます。
PGODemoDLL プロジェクトに対して手順 21. を繰り返します。
次に、PGODemoDLL.dll へのパスを、PGODemo アプリケーションのパス環境変数に追加します。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックし、[プロパティ] をクリックします。 [構成] ボックスの [PGIRelease] 構成を選択します。 [構成プロパティ] の [デバッグ] をクリックします。 [環境] に次のように入力し、[適用] をクリックします。
path=%path%;$(SolutionDir)PGODemoDLL\PGIRelease
[構成] ボックスの [PGORelease] 構成を選択します。 [構成プロパティ] の [デバッグ] をクリックします。 [環境] ボックスに、次のように入力します。
path=%path%;$(SolutionDir)PGODemoDLL\PGORelease
次に [適用] をクリックし、[OK] をクリックしてダイアログを閉じます。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックし、[プロパティ] をクリックします。 [構成] ボックスの [PGORelease] 構成を選択します。 [構成プロパティ] の [リンカー] をクリックし、[最適化] をクリックします。 [ガイド付きデータベースのプロファイル] エディット ボックスで、$(TargetDir) を $(IntDir)\ で置き換えます。
PGODemoDLL プロジェクトに対してこの手順を繰り返します。
ソリューション エクスプローラーで、PGODemoDLL プロジェクトを右クリックし、[プロパティ] をクリックします。 [構成] ボックスの [PGORelease] 構成を選択します。 [構成プロパティ] の [リンカー] をクリックし、[詳細] をクリックします。 [インポート ライブラリ] エディット ボックスで、$(TargetDir) を $(IntDir)\ で置き換えます。
[標準] ツール バーの [ソリューション構成] ボックスをクリックし、[PGIRelease] 構成を選択します。 ソリューション エクスプローラーで、ソリューションを右クリックし、[ソリューションのビルド] をクリックします。
これにより、両方のプロジェクトのインストルメント化されたビットがビルドされます。
[デバッグ] メニューをクリックし、[デバッグ開始] または [デバッグなしで開始] をクリックします。 これにより、PGODemo が起動します。 アプリケーションをシャットダウンすると、2 つの .PGC ファイルが作成されます。これらのファイルは、PGODemo\PGIRelease および PGODemoDLL\PGIRelease という 2 つの各出力フォルダーに 1 ファイルずつ作成されます。
[標準] ツール バーの [ソリューション構成] ボックスをクリックし、[PGORelease] 構成を選択します。 ソリューション エクスプローラーで、ソリューションを右クリックし、[ソリューションのビルド] をクリックします。
両方のプロジェクトの PGORelease 構成フォルダーに PGO で最適化されたイメージが作成されます。
カスタム プロファイル データの収集
プロファイル データの収集の既定の動作では、インストルメント アプリケーションが起動してからシャットダウンされるまでの動作を示すすべてのデータが保存されます。 PGO には、PGOSWEEP というツールが用意されています。このツールは、プロファイル データの収集をカスタマイズするのに役立ちます。 PGOSWEEP を使用すると、プロファイル シナリオの実行中に特定のタイム フレームでプロファイル データを収集できます。
以下の手順では、Visual Studio 開発環境とコマンド ライン ツールを使用し、プロファイル データの収集を制御する方法について説明します。
Win32 プロジェクトを作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] ペインの [Visual C++ プロジェクト] ノードを選択し、[テンプレート] ペインの [Win32 プロジェクト] を選択します。
[プロジェクト名] ボックスに「PGODemo」と入力します。
[OK] をクリックします。 Win32 アプリケーション ウィザードが表示されます。
既定の設定をすべてそのまま使用します。 [完了] をクリックします。
インストルメント化された PGODemo プロジェクトを IDE でビルドするには
[標準] ツール バーの [ソリューション構成] ボックスをクリックし、[Release] 構成を選択します。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 ショートカット メニューの [ガイド付き最適化のプロファイル] をクリックし、[インストルメント] をクリックします。
ソリューション エクスプローラーで、PGODemo プロジェクトを右クリックします。 ショートカット メニューの [ガイド付き最適化のプロファイル] をクリックし、[インストルメントまたは最適化されたアプリケーションの実行] をクリックします。 これにより、アプリケーションが起動します。 通常、[デバッグ] メニューの [デバッグ開始] または [デバッグなしで開始] を使用して、インストルメント アプリケーションを起動することもできます。
[ツール] メニューをクリックし、[外部ツール] をクリックします。 [外部ツール] ダイアログ ボックスが表示されます。 [追加] をクリックします。 [タイトル] エディット ボックスに「Pgosweep」と入力します。 [コマンド] エディット ボックスの隣の [...] をクリックし、PGOSWEEP ツールのパスを指定します。 PGOSWEEP は、Visual Studio がインストールされている...\VC\bin フォルダーにインストールする必要があります。 [起動時に引数を入力] チェック ボックスをオンにし、[OK] をクリックして [外部ツール] ダイアログ ボックスを閉じます。
[ツール] メニューの [PGOSWEEP] をクリックします。 ダイアログ ボックスが表示されます。 [引数] ボックスに、次のように入力します。
$(TargetPath) $(TargetDir)$(TargetName)_custom!1.pgc
[OK] をクリックします。
PGODemo メイン ウィンドウで、[ファイル] をクリックし、[終了] をクリックして、プロファイル データの収集を終了します。
ここで、$(OutDir) を参照すると、2 つの .PGC ファイルが見つかります。 PGODemo_custom!1.pgc は、PGOSWEEP で作成されたファイルで、プロファイルを実行してから PGOSWEEP を呼び出した時点までのプロファイル データを含んでいます。 2 つ目のファイルは、既定の名前付けスキームである PGODemo!1.pgc を使用し、一掃してからインストルメント アプリケーションをシャットダウンするまでのプロファイル データを含んでいます。
重要なのは、$(ProjectName)! n.PGC (n は数字) という標準の名前付けスキームに準拠した .PGC ファイルだけが、最適化されたイメージをビルドする際に自動的にマージされることです。 上記の手順で作成した PGODemo_custom!1.pgc をマージするには、カスタムのマージ手順を追加する必要があります (このチュートリアルで既に説明した「カスタム プロファイル データのマージ」シナリオを参照してください)。
これらの手順を使用すると、プロファイル データの収集を制御し、実行時に、アプリケーションの最重要部分に基づいてそのアプリケーションを最適化できます。
コマンド ラインからのプロファイル データの収集
コマンド ライン ツールを使用して、次のようにカスタム プロファイル データの収集を実行できます。
マージしたプロファイル データをコマンド ラインからビルドするには
インストルメント化された実行可能ファイルを作成します。
cl.exe /c /GL /O2 S1.cpp Sn.cpp link /ltcg:pgi S1.obj Sn.obj /out:myapp.exe
インストルメント化された myapp.exe を実行します。実行中の必要な時点で、pgosweep ツールを使用してプロファイル データを収集します。
Pgosweep myapp.exe mycustomdata.pgc
メモ 標準形式に従っていない PGC ファイルは、Pgomgr ツールを使用して手動でマージする必要があります。
myapp.exe をシャットダウンすると、別の .PGC ファイル (myapp!1.pgc) が自動的に作成されます。 このファイルをプロファイル データの一部として使用しない場合は、リンカーを使用して最適化された myapp.exe をビルドする前に、このファイルを削除するか、リンカーの作業ディレクトリ以外の場所に移動してください。
Pgomgr を使用して mycustomdata.pgc をマージします。
Pgomgr –merge mycustomdata.pgc myapp.pgd
リンク コマンドを実行し、最後に最適化されたアプリケーションを作成します。
link /ltcg:pgo /pgd:myapp
PgoAutoSweep を使用したカスタム プロファイル データの収集
実行時のどの時点でも、アプリケーションから PgoAutoSweep を呼び出してプロファイル データを保存およびリセットできます。 次の例では、このしくみを説明します。
次の例では、2 つの .PGC ファイルが作成されます。 最初のファイルには、カウントが 3 になるまでの実行時の動作を示すデータが含まれます。2 つ目のファイルには、この時点からアプリケーション終了時までに収集されたデータが含まれます。
#include <stdio.h>
#include <windows.h>
#include <pgobootrun.h>
int count = 10;
int g = 0;
void func2(void)
{
printf("hello from func2 %d\n", count);
Sleep(2000);
}
void func1(void)
{
printf("hello from func1 %d\n", count);
Sleep(2000);
}
void main(void)
{
while (count--)
{
if(g)
func2();
else
func1();
if (count == 3)
{
PgoAutoSweep("func1");
g = 1;
}
}
PgoAutoSweep("func2");
}