チュートリアル: パフォーマンスの問題を特定するWalkthrough: Identifying Performance Problems

このチュートリアルでは、アプリケーションのプロファイルを行ってパフォーマンス上の問題を特定する方法を示します。This walkthrough demonstrates how to profile an application to identify performance problems.

このチュートリアルでは、マネージ アプリケーションのプロファイリングを行う方法と、サンプリングおよびインストルメンテーションを使用してアプリケーションのパフォーマンス上の問題を特定する方法について、順をおって説明します。In this walkthrough, you will step through the process of profiling a managed application and using sampling and instrumentation to isolate and identify performance problems in the application.

このチュートリアルでは、次の手順を行います。In this walkthrough, you will follow these steps:

  • サンプリング方式を使用してアプリケーションのプロファイリングを行います。Profile an application by using the sampling method.

  • サンプリングしたプロファイリング結果を分析して、パフォーマンス上の問題を特定および修正します。Analyze sampled profiling results to locate and fix a performance issue.

  • インストルメンテーション方式を使用してアプリケーションのプロファイリングを行います。Profile an application by using the instrumentation method.

  • インストルメントしたプロファイリング結果を分析して、パフォーマンス上の問題を特定および修正します。Analyze instrumented profiling results to locate and fix a performance issue.

必須コンポーネントPrerequisites

  • C# についての中級レベルの知識。Intermediate understanding of C#.

  • PeopleTrax サンプルのコピー。A copy of the PeopleTrax Sample.

    プロファイリングによって得られた情報を操作するには、デバッグ シンボル情報を使用できるようにしておくことをお勧めします。To work with the information provided by profiling, it is best to have debugging symbol information available.

サンプリング方式を使用したプロファイリングProfiling by Using the Sampling Method

サンプリングとは 1 つのプロファイリング方式で、対象のプロセスを定期的にポーリングしてアクティブな関数を識別します。Sampling is a profiling method by which the process in question is periodically polled to determine the active function. 結果のデータからは、プロセスがサンプリングされたときに対象の関数が呼び出し履歴の一番上に配置されていた回数がわかります。The resulting data provides a count of how frequently the function in question was on top of the call stack when the process was sampled.

サンプリング方式を使用してアプリケーションのプロファイリングを行うにはTo profile an application by using the sampling method

  1. 管理者特権で Visual StudioVisual Studio を開きます。Open Visual StudioVisual Studio with Administrator privileges. 管理者として実行する場合は、プロファイリングが必要です。Running as an administrator is required for profiling.

  2. PeopleTrax ソリューションを開きます。Open the PeopleTrax solution.

    これで、PeopleTrax ソリューションがソリューション エクスプローラーに読み込まれます。The PeopleTrax solution now populates Solution Explorer.

  3. プロジェクトの構成設定を [Release] に設定します。Set the project configuration setting to Release.

    アプリケーションにおけるパフォーマンス上の問題を検出する場合は、リリース ビルドを使用する必要があります。You should use a release build to detect performance problems in your application. デバッグ ビルドを使用すると、パフォーマンスに悪影響を及ぼす可能性のある追加情報がコンパイルされ、パフォーマンスの問題が正しく示されないことがあるため、プロファイリングにはリリース ビルドを使用してください。A release build is recommended for profiling because a debug build has additional information compiled into it that might adversely affect performance and do not illustrate performance issues accurately.

  4. [分析] メニューで、[パフォーマンス プロファイラー][パフォーマンス ウィザード][開始] の順に選択します。On the Analyze menu, select Performance Profiler, then select Performance Wizard, and then select Start.

    パフォーマンス ウィザードが表示されます。The Performance Wizard appears.

  5. [CPU サンプリング (推奨)] が選択されていることを確認して、[次へ] をクリックします。Make sure CPU Sampling (recommended) is selected and then click Next.

  6. [プロファイル対象のアプリケーションを選択してください] で [PeopleTrax] を選択して、[次へ] をクリックします。In Which application would you like to target for profiling, select PeopleTrax, and then click Next.

    Visual StudioVisual Studio によってプロジェクトがビルドされ、アプリケーションのプロファイリングが開始されます。 builds the project and starts to profile the application. PeopleTrax アプリケーション ウィンドウが表示されます。The PeopleTrax application window appears.

  7. [Get People] をクリックします。Click Get People.

  8. [ExportData] をクリックします。Click ExportData.

    メモ帳が開かれ、PeopleTrax からエクスポートされたデータを含む新しいファイルが表示されます。Notepad opens and displays a new file that contains the exported data from PeopleTrax.

  9. メモ帳を閉じ、PeopleTrax アプリケーションを閉じます。Close Notepad, and then close PeopleTrax application.

    プロファイラーによってプロファイル データ (*.vsp) ファイルが生成され、[パフォーマンス エクスプローラー] ウィンドウの [レポート] セクションにファイル名の一覧が表示されます。さらに、Visual StudioVisual Studio メイン ウィンドウのデータ ファイルの [概要] ビューが自動的に読み込まれます。The profiler generates a profiling data (*.vsp) file, lists the file name in the Reports section of the Performance Explorer window, and automatically loads the Summary view of the data file in the main window of Visual StudioVisual Studio.

サンプリングされたプロファイリング結果を分析するにはTo analyze sampled profiling results

  1. [概要] ビューには、プロファイリング実行中における CPU 使用率のタイムライン、最もアクティブなアプリケーションのコール ツリーの分岐を表す [ホット パス] の一覧、関数本体でのコードの実行中に最も頻繁にサンプリングされた関数を表示する [最も頻繁に個別の作業を実行している関数] の一覧が表示されます。The Summary view displays a timeline of the CPU utilization over the course of the profiling run, the Hot Path list that represents the branch of the application's call tree that was most active, and a list of the Functions Doing Most Individual Work that shows the functions that were most heavily sampled while executing code in their own function body.

    [ホット パス] の一覧を確認し、PeopleNS.People.GetNames メソッドは一覧の最後の部分に表示されている PeopleTrax 関数であることを確認します。Examine the Hot Path list and notice that the PeopleNS.People.GetNames method is the PeopleTrax function closest to the end of the list. ここでは、この関数を調べてみることにします。Its position makes it a good candidate for analysis. 関数名をクリックすると、GetNames の詳細情報が [関数の詳細] ビューに表示されます。Click the function name to display details of GetNames in the Function Details view.

  2. [関数の詳細] ビューには 2 つのウィンドウがあります。The Function Details view contains two windows. [コスト配分] ウィンドウには、対象の関数によって実行された処理、対象の関数から呼び出された関数によって実行された処理、対象の関数を呼び出した関数によるサンプリング対象インスタンス数への影響がグラフィック表示されます。The cost distribution window provides a graphical view of the work done by the function, the work done by the functions that it called, and the contribution of functions that called the function to the number of instances that were sampled. 関数名をクリックすると、ビュー内で関数のフォーカスを移動できます。You can change the function that is the focus of the view by clicking a function name. たとえば PeopleNS.People.GetPeople をクリックすると、GetPeople 関数が選択されます。For example, you can click PeopleNS.People.GetPeople to make GetPeople the selected function.

    [関数コード ビュー] ウィンドウには使用できる関数のソース コードが表示され、選択された関数内で最も負荷のかかるコード行が強調表示されます。The Function Code View window shows you the source code for the function if it is available and highlights the most expensive lines in the selected function. GetNames を選択すると、この関数はアプリケーション リソースから文字列を読み込み、StringReader を使用して文字列の各行を ArrayList に追加していることがわかります。When GetNames is selected, you can see that this function reads a string from the application resources and then uses a StringReader to add each line in the string to an ArrayList. この関数を明示的に最適化する方法はありません。There is no obvious way to optimize this function.

  3. GetNames の呼び出し元は PeopleNS.People.GetPeople だけであるため、[コスト配分] ウィンドウの GetPeople をクリックすると、このメソッドのコードが表示されます。Because PeopleNS.People.GetPeople is the only caller of GetNames, click GetPeople in the cost distribution window to examine its code. このメソッドは、GetNames によって取得されたユーザー名と会社名を使用して、PersonInformationNS.PersonInformation オブジェクトの ArrayList を返します。This method returns an ArrayList of PersonInformationNS.PersonInformation objects from the names of people and companies produced by GetNames. ただし、PersonInformation オブジェクトが作成されるたびに、GetNames が 2 回呼び出されます。However, GetNames is called twice every time that a PersonInformation object is created. メソッドの開始時に 1 回だけリストを作成し、PersonInformation の作成ループの実行中にこのリストのインデックスを作成することにより、この関数を簡単に最適化できます。You can see that the method can be easily optimized by creating the lists only once at the start of the method and indexing into those lists during the PersonInformation creation loop.

  4. サンプルのアプリケーション コードには、GetPeople の別バージョンが記述されています。このサンプル コードの場合、条件付きコンパイル シンボルをビルド プロパティに追加することにより、最適化された関数を呼び出すことができます。An alternative version of GetPeople is provided with the sample application code and you can call the optimized function by adding a conditional compilation symbol to the build properties. この場合、[ソリューション エクスプローラー] ウィンドウで People プロジェクトを右クリックして、[プロパティ] をクリックします。In the Solution Explorer window, right-click the People project and then click Properties. 次に、プロパティ ページ メニューの [ビルド] をクリックし、[条件付きコンパイル シンボル] ボックスに「OPTIMIZED_GETPEOPLE」と入力します。Click Build on the property page menu and then type OPTIMIZED_GETPEOPLE in the Conditional compilation symbol text box. この状態でビルドを実行すると、最適化されたバージョンの GetPeople によって元のメソッドが置き換えられます。The optimized version of GetPeople replaces the original method in the next build.

  5. パフォーマンス セッションを再実行します。Rerun the performance session. パフォーマンス エクスプローラーのツール バーの [プロファイルを使用して起動] をクリックします。On the Performance Explorer toolbar, click Launch with Profiling. 次に、[Get People] をクリックして [データのエクスポート] をクリックします。Click Get People and then click Export Data. [メモ帳] ウィンドウが表示されたらこのウィンドウを閉じ、次に PeopleTrax アプリケーションを終了します。Close the Notepad window that appears and then close the People Trax application.

    この操作により、新しいプロファイル データ ファイルが生成され、新しいデータ用の [概要] ビューが Visual StudioVisual Studio のメイン ウィンドウに表示されます。A new profiling data file is generated, and a Summary view for the new data appears in the Visual StudioVisual Studio main window.

  6. 2 つのプロファイリング実行を比較するには、2 つのデータ ファイルをパフォーマンス エクスプローラーで選択して右クリックし、[パフォーマンス レポートの比較] をクリックします。To compare the two profiling runs, select the two data files in the Performance Explorer, right-click the files, and then click Compare Performance Reports. [比較レポート] ウィンドウが Visual StudioVisual Studio のメイン ウィンドウに表示されます。A Comparison Report window appears in the Visual StudioVisual Studio main window. [差分] 列には、[初期値][比較対象値] を基にして、関数のパフォーマンス値における差異が表示されます。The Delta column shows the change in the performance value of functions from the earlier Baseline value to the later Comparison value. 比較対象の値は、[列] ドロップダウン リストから選択できます。You can select the values to compare from the Column drop down list. ここでは、[サンプル % (子を含む)] を選択します。Select Inclusive Samples %.

    GetPeople メソッドと GetNames メソッドにより、パフォーマンスが大幅に改善されることを確認してください。Notice that the GetPeople and GetNames methods show considerable performance gains.

インストルメンテーション方式を使用したプロファイリングProfiling by Using the Instrumentation Method

インストルメンテーションは、プロファイリング方法の 1 つです。この方法の場合、特別にビルドされたプロファイリング済みバイナリのバージョンに対して、プローブ関数がプロファイラーによって挿入されます。Instrumentation is a profiling method in which the profiler inserts probe functions into specially built versions of the profiled binaries. 挿入されたプローブ関数により、関数内のすべての呼び出しサイトにおいて、インストルメント化されたモジュール内の関数の開始時と終了時のタイミング情報が収集されます。The probes collect timing information at the entry and exit of functions in the instrumented modules and at all call site in those functions. インストルメンテーション プロセスは、ディスクへの書き込みやネットワーク上での通信など、入出力操作に関する問題を調査する場合に便利です。The instrumentation process is useful for investigating issues related to input/output operations such as writing to disk and communicating over a network. インストルメンテーション方式の場合、サンプリング方式よりもさらに詳細な情報を取得できますが、プロセス実行時の負荷が高くなり、オーバーヘッドの量も大きくなります。Instrumentation provides more detailed information than sampling, but it is more intrusive in process execution and incurs a greater amount of overhead. インストルメントされたバイナリはデバッグまたはリリース バイナリよりも大きく、配置向けではありません。Instrumented binaries are also larger than debug or release binaries and are not intended for deployment.

ここからは、インストルメンテーション方式を使用して、上でプロファイリングを行った PeopleTrax アプリケーションのコードをさらに最適化できないかどうかを確認します。In this section of the walkthrough, we will use the instrumentation method to discover more code we can optimize in the PeopleTrax application we profiled previously. 具体的には、[概要] ビューのタイムラインのフィルターを使用して、プロファイリング済みアプリケーション (メモ帳ファイルにユーザーのリストを書き込むアプリケーション) におけるデータ エクスポートのシナリオについて確認します。By using the filter of the Summary view timeline, we will focus our analysis on the export data scenario in our profiled application in which the list of people is written to a Notepad file.

インストルメンテーション方式を使用して既存のアプリケーションのプロファイリングを行うにはTo profile an existing application by using the instrumentation method

  1. 必要に応じて、PeopleTrax アプリケーションを Visual Studio で開きます。If necessary, open the PeopleTrax application in Visual Studio.

    管理者として実行していること、およびソリューションのビルド構成が [解放] に設定されていることを確認します。Make sure that you are running as Administrator and that the build configuration for the solution is set to Release.

  2. パフォーマンス エクスプローラーで、[インストルメンテーション] を右クリックします。In Performance Explorer, click Instrumentation.

  3. パフォーマンス エクスプローラーのツール バーの [プロファイルを使用して起動] をクリックします。On the Performance Explorer toolbar, click the Launch with Profiling.

    プロファイラーによってプロジェクトがビルドされ、アプリケーションのプロファイリングが開始されます。The profiler builds the project and starts to profile the application. PeopleTrax アプリケーション ウィンドウが表示されます。The PeopleTrax application window appears.

  4. [Get People] をクリックします。Click Get People.

    PeopleTrax データ グリッドにデータが設定されます。The PeopleTrax data grid populates with data.

  5. 10 秒ほど待機してから、[データのエクスポート] をクリックします。Wait for about 10 seconds and then click Export Data.

    メモ帳が開かれ、PeopleTrax の人名リストを含む新しいファイルが表示されます。Notepad starts and displays a new file that contains a list of people from PeopleTrax. 待機することにより、フィルター処理用のデータ エクスポート手順をさらに簡単に識別できます。Waiting enables you to more easily identify the data export procedure for filtering.

  6. メモ帳を閉じ、PeopleTrax アプリケーションを閉じます。Close Notepad, and then close PeopleTrax application.

    Visual StudioVisual Studio によって、パフォーマンス セッション レポート (.vsp) が生成されます。 generates a performance session report (.vsp).

インストルメントされたプロファイリング結果を分析するにはTo analyze instrumented profiling results

  1. レポートの [概要] ビューのタイムライン グラフには、プロファイリング実行中のプログラムによる CPU 使用率が表示されます。The timeline graph of the Summary view of the report shows the CPU utilization of the program over the duration of the profiling run. 上で実行したデータのエクスポート操作は、このグラフの右側に急激な上向きの折れ線 (または水平線) として表示されます。 The export data operation should be the large peak or plateau on the right side of the graph. パフォーマンス セッションをフィルター処理すると、エクスポート操作で収集されたデータだけを表示して分析できます。We can filter the performance session to display and analyze only the data that was collected in the export operation. その場合、エクスポート操作が開始された位置の左側をグラフ上でクリックします。Click to the left of the point on the graph where the export data operation begins. 次に、その位置の右側をもう一度クリックします。Click again to the right side of the operation. さらに、タイムラインの右側に表示されているリンクの一覧内の [選択項目でフィルター] をクリックします。Then click Filter by Selection in the list of links to the right of the timeline.

    PeopleTrax.Form1.ExportData メソッドから呼び出された Concat メソッドが大量の時間を消費していることが、[ホット パス] ツリーにパーセンテージで表示されます。The Hot Path tree show that the Concat method that is called by PeopleTrax.Form1.ExportData method consumes a large percentage of the time. System.String.Concat[個別作業が一番多い関数] の一覧の先頭に表示されているため、この関数による処理時間の削減も最適化につながります。Because System.String.Concat is also at the top of the Functions With Most Individual Work list, reducing the time spent in the function is a likely point of optimization.

  2. いずれかの概要テーブルで [System.String.Concat] をダブルクリックし、[関数の詳細] ビューで追加情報を表示します。Double-click System.String.Concat in either of the summary tables to see more information in the Function Details view.

  3. ビューを確認すると、Concat を呼び出しているメソッドは PeopleTrax.Form1.ExportData だけだということがわかります。You can see that the PeopleTrax.Form1.ExportData is the only method that calls Concat. [呼び出し元の関数] の一覧で [PeopleTrax.Form1.ExportData] をクリックし、[関数の詳細] ビューのターゲットとしてこのメソッドを選択します。Click PeopleTrax.Form1.ExportData in the Calling Functions list to select the method is as the target of the Function Details view.

  4. [関数コード ビュー] ウィンドウのメソッドを確認します。Examine the method in the Function Code View window. System.String.Concat へのリテラル呼び出しがないことがわかります。Notice that there are no literal calls to System.String.Concat. その代わりに、+= オペランドがいくつか使用されています。これらのオペランドは、コンパイラによって System.String.Concat への呼び出しに置き換えられます。Instead, there are several uses of the += operand, which the compiler replaces with calls to System.String.Concat. .NET Framework で文字列に変更を加えると、新しい文字列が割り当てられます。Any modifications to a string in the .NET Framework cause a new string to be allocated. .NET Framework には、文字列の連結用に最適化された StringBuilder クラスが用意されています。The .NET Framework includes a StringBuilder class that is optimized for string concatenation

  5. この問題領域を最適化されたコードに置き換えるために、PeopleTrax プロジェクトに OPTIMIZED_EXPORTDATA を条件付きコンパイル シンボルとして追加します。To replace this problem area with optimized code, add OPTIMIZED_EXPORTDATA as a conditional compilation symbol to the PeopleTrax project.

  6. ソリューション エクスプローラーで、PeopleTrax プロジェクトを右クリックし、[プロパティ] をクリックします。In Solution Explorer, right-click the PeopleTrax project and then click Properties.

    PeopleTrax プロジェクトのプロパティ フォームが表示されます。The PeopleTrax project properties form appears.

  7. [ビルド] タブをクリックします。Click the Build tab.

  8. [条件付きコンパイル シンボル] ボックスに、「OPTIMIZED_EXPORTDATA」と入力します。In the Conditional Compilation Symbols text box, type OPTIMIZED_EXPORTDATA.

  9. プロジェクトのプロパティ フォームを閉じ、確認メッセージが表示されたら [すべてを保存] をクリックします。Close the project property form and choose save all when you are prompted.

    アプリケーションを再度実行すると、パフォーマンスが大幅に改善されたことがわかります。When you run the application again, you will see marked improvements in performance. ユーザーが知覚できる程度にパフォーマンスが改善された場合でも、プロファイリング セッションを再び実行することをお勧めします。It is recommended that you run the profiling session again, even if there are user visible improvements in performance. ある問題によって他の問題の存在が表面化しない場合があるため、問題を解決したら必ずデータをレビューする必要があります。Reviewing the data after you fix a problem is important because the first problem might obscure some other problem.

参照See Also

概要 Overviews
はじめに Getting Started
/Z7、/Zi、/ZI (デバッグ情報の形式)/Z7, /Zi, /ZI (Debug Information Format)