チュートリアル : アプリケーションのプロファイリング
更新 : 2007 年 11 月
このチュートリアルでは、アプリケーションのプロファイルを行ってパフォーマンス上の問題を特定する方法を示します。
このチュートリアルでは、マネージ アプリケーションのプロファイリングを行う方法と、サンプリングおよびインストルメンテーションを使用してアプリケーションのパフォーマンス上の問題を特定および識別する方法の各手順を説明します。
このチュートリアルでは、次の手順を行います。
サンプリング方式を使用してアプリケーションのプロファイリングを行います。
サンプリングしたプロファイリング結果を分析して、パフォーマンス上の問題を特定および修正します。
インストルメンテーション方式を使用してアプリケーションのプロファイリングを行います。
インストルメントしたプロファイリング結果を分析して、パフォーマンス上の問題を特定および修正します。
前提条件
Microsoft Visual Studio 2005 Team System.
C# についての中級レベルの知識。
プロファイリングによって得られた情報を操作するには、デバッグ シンボル情報を使用できるようにしておくことをお勧めします。
サンプリング方式を使用したプロファイリング
サンプリングとは 1 つのプロファイリング方式で、対象のプロセスを定期的にポーリングしてアクティブな関数を識別します。結果のデータからは、プロセスがサンプリングされたときに対象の関数が呼び出し履歴の一番上に配置されていた回数がわかります。
サンプリング方式を使用してアプリケーションのプロファイリングを行うには
Microsoft Visual Studio 2005 で PeopleTrax ソリューションを開きます。
これで、PeopleTrax ソリューションがソリューション エクスプローラに読み込まれます。
[分析] メニューの [パフォーマンス ウィザードの起動] をクリックします。
パフォーマンス ウィザードが表示されます。
[使用可能なターゲット] ボックスの一覧の [PeopleTrax] を選択し、[次へ] をクリックします。
[サンプリング] をクリックし、[次へ] をクリックします。
[完了] をクリックします。
プロジェクトの構成設定を [Release] に設定します。
アプリケーションのパフォーマンス上の問題を検出する場合は、リリース ビルドを使用することをお勧めします。
デバッグ ビルドはパフォーマンスに悪影響を及ぼす可能性のある追加の情報がコンパイルされ、パフォーマンスの問題が正しく示されないことがあるため、リリース ビルドの使用が推奨されます。
リリース ビルドは、自動的にはシンボル情報を提示しません。プロファイラ パフォーマンス レポートにシンボル情報が記述されるようにビルドを構成するには、「/Z7、/Zi、/ZI (デバッグ情報の形式)」および「方法 : Windows シンボル情報を参照する」を参照してください。
パフォーマンス エクスプローラのツール バーの [起動] をクリックします。
Visual Studio 2005 により、プロジェクトが構築され、アプリケーションのプロファイリングが開始されます。PeopleTrax アプリケーション ウィンドウが表示されます。
[Get People] をクリックします。
[データのエクスポート] をクリックします。
メモ帳が開かれ、PeopleTrax からエクスポートされたデータを含む新しいファイルが表示されます。
メモ帳を閉じ、PeopleTrax アプリケーションを閉じます。
Visual Studio 2005 は、パフォーマンス セッション レポート (*.vsp) を生成し、自動的に読み込みます。
サンプリングされたプロファイリング結果を分析するには
[プロファイラ] ウィンドウのツール バーで、レポート ビューのボックスの一覧を開き、レポートの [関数] ビューを選択します。
データ グリッドを右クリックし、[列の追加と削除] をクリックします。
[列の追加と削除] ダイアログ ボックスが表示されます。
列の一覧から [Source File Name] を選択し、[OK] をクリックします。
データ グリッドで、[Source File Name] 列をクリックして、データ グリッドを並べ替えます。
この列を基準に並べ替えを行うことで、PeopleTrax ソリューションに関係するすべての行がグループ化されます。
PeopleTrax ソリューションのデータが表示されている行を見つけます。
これらの行を調べると、次の関数が PeopleTrax ソリューションの他の部分よりも頻繁にサンプリングされていることがわかります。
PeopleTrax.Form1.GetPeopleButton_Click
GetPeopleButton_Click イベントにフォーカスを移します。
[PeopleTrax.Form1.GetPeople_Click] 行を右クリックし、[ソースの表示] をクリックします。
Form1.cs がコード エディタで開かれ、GetPeopleButton_Click イベントにポインタが位置付けられます。
GetPeopleButton_Click イベントのソース コードを確認します。
ソース コードを確認することで、最適化の余地がある部分を見つけられます。
ListView.ListViewItemCollection クラスの Add メソッドを使用して 1 つずつ項目を追加する場合は、BeginUpdate メソッドを使用して、項目がリストに追加されるたびにリスト ビューが再描画されるという状況を回避できます。項目をコントロールに追加するタスクが完了した後で、EndUpdate メソッドを呼び出してリスト ビューを再描画できるようにします。コントロールに多数の項目を追加する場合は、この方法で項目を追加すると、リスト ビューを描画するときにちらつきません。また、リスト ビューへの項目の読み込みにかかる時間も短縮されます。
App.Config の既定の設定は 1,500 個の名前です。
リスト ビュー項目の前景色を設定する場合は、文字列で色を指定して Color.FromName メソッドを呼び出す代わりに KnownColor 列挙体を使用すると、パフォーマンスが向上します。
このイベントは、People.GetPeople という関数を呼び出して、リスト ビューに追加する名前の配列を取得します。
GetPeople の呼び出しを右クリックし、[定義へ移動] をクリックします。
ソース コードを確認することで、最適化の余地がある部分を見つけられます。
fullName と companyName の新しい配列を取得するコードは繰り返し実行されます。これらの配列は、1 回だけ作成して再利用する必要があります。
これらの問題領域を最適化されたコードに置き換えるために、PeopleTrax プロジェクトと People プロジェクトに OPTIMIZED_GETPEOPLE を条件付きコンパイル シンボルとして追加します。
ソリューション エクスプローラで、PeopleTrax プロジェクトを右クリックし、[プロパティ] をクリックします。
PeopleTrax プロジェクトのプロパティ フォームが表示されます。
[ビルド] タブをクリックします。
[条件付きコンパイル シンボル] ボックスで、OPTIMIZED_GETPEOPLE を追加します。
People プロジェクトに対して手順 18. ~ 20. を繰り返します。
プロジェクトのプロパティ フォームを閉じ、保存の確認メッセージが表示されたらすべてを保存します。
ユーザーが知覚できる程度にパフォーマンスが改善された場合でも、プロファイリング セッションを再び実行することをお勧めします。ある問題によって他の問題の存在が隠されている場合があるので、1 つの問題を解決した後にデータを確認することが重要です。
次に、インストルメンテーション方式を使用してアプリケーションのプロファイリングを行います。
インストルメンテーション方式を使用したプロファイリング
インストルメンテーションとは、1 つのプロファイリング方式です。インストルメントされるモジュール内の関数に制御が渡されるときと、関数から制御が返されるときのタイミング情報を収集するプローブ関数が、プロファイリングされるバイナリの特別に構築されたバージョンに含まれています。このプロファイリング方式は、サンプリングよりも深くプログラムに入り込むので、オーバーヘッドが大きくなります。インストルメントされたバイナリはデバッグまたはリリース バイナリよりも大きく、配置向けではありません。
インストルメンテーション方式を使用して既存のアプリケーションのプロファイリングを行うには
パフォーマンス エクスプローラのドロップダウン リストの [インストルメンテーション] をクリックします。
パフォーマンス エクスプローラのツール バーの [起動] をクリックします。
Microsoft Visual Studio 2005 により、プロジェクトが構築され、アプリケーションのプロファイリングが開始されます。PeopleTrax アプリケーション ウィンドウが表示されます。
[Get People] をクリックします。
PeopleTrax データ グリッドにデータが設定されます。
[データのエクスポート] をクリックします。
メモ帳が開かれ、PeopleTrax の人名リストを含む新しいファイルが表示されます。
メモ帳を閉じ、PeopleTrax アプリケーションを閉じます。
Microsoft Visual Studio 2005 によって、パフォーマンス セッション レポート (*.vsp) が生成されます。
インストルメントされたプロファイリング結果を分析するには
レポートの [概要] ビューで、概要テーブルを見直して、呼び出された回数が最も多い関数や、アプリケーションの実行が最も多く発生している場所を識別します。
この情報により、アプリケーションで System.String.Concat 処理の実行に多くの時間を要していることがわかります。
いずれかの概要テーブルで [System.String.Concat] をダブルクリックします。
レポートの表示が [関数] ビューに切り替わり、[System.String.Concat] が強調表示されます。
[System.String.Concat] 行を右クリックし、[呼び出し元/呼び出し先ビューで表示] をクリックします。
レポートの表示が [呼び出し元/呼び出し先] ビューに切り替わり、この関数が PeopleTrax.Form1.ExportData によって呼び出されることが表示されます。
[PeopleTrax.Form1.ExportData] を右クリックし、[ソースの表示] をクリックします。
Form1.cs がコード エディタで開かれ、ExportData 関数にポインタが位置付けられます。
ExportData 関数のソース コードを確認します。
ソース コードを確認すると、System.String.Concat へのリテラル呼び出しがないことがわかります。その代わり、IL において System.String.Concat と置き換えられる += オペランドがいくつか使用されています。.NET Framework で文字列に変更を加えると、新しい文字列が割り当てられます。.NET Framework には、文字列の連結に最適化された StringBuilder クラスがあります。
この問題領域を最適化されたコードに置き換えるために、PeopleTrax プロジェクトに OPTIMIZED_EXPORTDATA を条件付きコンパイル シンボルとして追加します。
ソリューション エクスプローラで、PeopleTrax プロジェクトを右クリックし、[プロパティ] をクリックします。
PeopleTrax プロジェクトのプロパティ フォームが表示されます。
[ビルド] タブをクリックします。
[条件付きコンパイル シンボル] ボックスで、OPTIMIZED_EXPORTDATA を追加します。
プロジェクトのプロパティ フォームを閉じ、確認メッセージが表示されたら [すべてを保存] をクリックします。
アプリケーションを再度実行すると、パフォーマンスが大幅に改善されたことがわかります。ユーザーが知覚できる程度にパフォーマンスが改善された場合でも、プロファイリング セッションを再び実行することをお勧めします。ある問題によって他の問題の存在が隠されている場合があるので、1 つの問題を解決した後にデータを確認することが重要です。