CPU 使用率を分析してアプリケーションのパフォーマンスを測定する (C#、Visual Basic、C++、F#)
デバッガー統合 CPU 使用率 診断ツールを使用してデバッグ中にパフォーマンスの問題を見つけます。 デバッガーをアタッチせずに、または実行中のアプリをターゲットにして、CPU 使用率を分析することもできます。 詳細については、「
デバッガーが一時停止すると、[診断ツール] ウィンドウの CPU 使用率 ツールによって、アプリケーションで実行されている関数に関する情報が収集されます。 このツールには、作業を実行していた関数が一覧表示され、サンプリング セッションの特定のセグメントに注目するために使用できるタイムライン グラフが提供されます。
重要
デバッガー統合診断ツールは、ASP.NET、ASP.NET Core、ネイティブ/C++ 開発など、Visual Studio での .NET 開発でサポートされています。 対応する Visual Studio ワークロード が必要です。 デバッガーを使用してプロファイリング ツールを実行するには、Windows 8 以降が必要です ([診断ツール] ウィンドウ
このチュートリアルでは、次の操作を行います。
- CPU 使用率データの収集
- CPU 使用率データの分析
手順 1: CPU 使用率データを収集する
Visual Studio でデバッグするプロジェクトを開き、CPU 使用率を調べる時点でアプリにブレークポイントを設定します。
分析するコードの関数または領域の末尾に 2 つ目のブレークポイントを設定します。
2 つのブレークポイントを設定することで、分析するコードの部分にデータ収集を制限できます。
診断ツールの ウィンドウは、オフにしていない限り自動的に表示されます。 もう一度ウィンドウを表示するには、[デバッグ]>[ウィンドウ]>[診断ツールの表示] をクリックします。
ツール バー
[ツールの選択] 設定を使用して、 CPU 使用率 、 メモリ使用量 、またはその両方を表示するかどうかを選択できます。 Visual Studio Enterprise を実行している場合は、Tools>Options>IntelliTraceで IntelliTrace を有効または無効にすることもできます。主に CPU 使用率を調べているので、CPU 使用率 が有効になっていることを確認します (既定で有効になっています)。
[デバッグ]>[デバッグの開始] をクリックします (または、ツール バーの [開始] をクリックするか、F5 キーを押します)。
アプリの読み込みが完了すると、診断ツールの概要ビューが表示されます。 ウィンドウを開く必要がある場合は、デバッグ>Windows>診断ツールを表示をクリックします。
最初のブレークポイントが到達するシナリオを実行します。
デバッガーが一時停止している間に、CPU 使用率データの収集を有効にして、[CPU 使用率の] タブを開きます。
[CPU プロファイル を記録] を選択すると、Visual Studio は関数の実行を記録し、その実行時間を測定します。 この収集されたデータは、アプリケーションがブレークポイントで停止した場合にのみ表示できます。
F5 キーを押して、2 番目のブレークポイントにアプリを実行します。
これで、2 つのブレークポイント間で実行されるコード領域専用のアプリケーションのパフォーマンス データが得られます。
プロファイラーがスレッド データの準備を開始します。 完了するまで待ちます。
[CPU 使用率] ツールの [CPU 使用率] タブにレポートが表示されます。
分析するコードのより具体的な領域を選択する場合は、CPU タイムラインでリージョンを選択します (プロファイル データを表示するリージョンである必要があります)。
この時点で、データの分析を開始できます。 データの収集または表示で問題が発生した場合は、「プロファイリング エラーのトラブルシューティングとの問題の修正」を参照してください。
ヒント
パフォーマンスの問題を特定する場合は、複数の測定を行います。 パフォーマンスは実行時によって当然異なります。通常、DLL の読み込み、JIT コンパイル メソッド、キャッシュの初期化などの 1 回限りの初期化作業により、コード パスの実行速度が低下します。 複数の測定を行うことで、表示されるメトリックの範囲と中央値をより適切に把握できます。これにより、コード領域の最初の時間と安定した状態のパフォーマンスを比較できます。
手順 2: CPU 使用率データを分析する
データの分析を開始するには、[CPU 使用率] の下にある関数の一覧を調べ、最も多くの作業を行っている関数を特定してから、各関数を詳しく調べることをお勧めします。
関数の一覧で、最も多くの作業を行っている関数を調べます。
ヒント
関数は、最も多くの作業を行う関数から順に一覧表示されます (呼び出し順序ではありません)。 これにより、実行時間が最も長い関数をすばやく特定できます。
関数の一覧で、多くの作業を行っているアプリ関数の 1 つをダブルクリックします。
関数をダブルクリックすると、左側のウィンドウに Functions ビューが開きます。 ドロップダウン メニューから「呼び出し元/呼び出し先」ビュー を選択します。
このビューでは、選択した関数が見出しと [現在の関数] ボックスに表示されます(この例では DoWork)。 現在の関数を呼び出した関数は、呼び出し元の関数の下の左側に表示され、現在の関数によって呼び出されたすべての関数は、右側の [呼び出された関数] ボックスに表示されます。 (いずれかのボックスを選択して、現在の関数を変更できます)。
このビューには、合計時間 (ミリ秒) と、関数が完了するまでにかかったアプリ全体の実行時間の割合が表示されます。 関数本体 では、呼び出しおよび呼び出された関数に費やされた時間を除き、関数本体に費やされた合計時間 (および時間の割合) も表示されます。
関数をダブルクリックすると、呼び出し元/呼び出し先 ビューが左側のウィンドウに開きます。
このビューでは、選択した関数がヘッダーと [現在の関数] ボックスに表示されます(この例では GetNumber)。 現在の関数を呼び出した関数は、左側の 呼び出し元の関数の下に表示され、現在の関数によって呼び出されたすべての関数は、右側の 呼び出された関数 ボックスに表示されます。 (いずれかのボックスを選択して、現在の関数を変更できます)。
このビューには、合計時間 (ミリ秒) と、関数が完了するまでにかかったアプリ全体の実行時間の割合が表示されます。 関数本体 では、呼び出しおよび呼び出された関数に費やされた時間を除き、関数本体に費やされた合計時間 (および時間の割合) も表示されます。 (この例では、2389 ミリ秒のうち 2367 ミリ秒が関数本体に費やされ、残りの 22 ミリ秒がこの関数によって呼び出された外部コードで費やされました)。
ヒント
関数本体 の値が高い場合は、関数自体のパフォーマンスのボトルネックを示している可能性があります。
関数が呼び出される順序を示す上位レベルのビューを表示するには、ウィンドウの上部にあるドロップダウン リストから [呼び出しツリー
選択します。 図の各番号付き領域は、手順のステップに関連しています。
画像 説明 をする アプリケーションを表す CPU 使用率呼び出しツリーの最上位ノード。 ほとんどのアプリでは、[外部コードの表示] オプションが無効になっている場合、第 2 レベルのノードは [外部コード] ノードです。このノードには、アプリの起動と停止、UI の描画、スレッド のスケジュール設定の制御、およびその他の下位レベルのサービスをアプリに提供するシステム コードとフレームワーク コードが含まれます。 をする 第 2 レベルのノードの子は、第 2 レベルのシステムおよびフレームワーク コードによって呼び出されるか作成されるユーザー コード メソッドと非同期ルーチンです。 メソッドの子ノードには、親メソッドの呼び出しに対してのみデータが含まれます。 外部コードの表示 が無効になっている場合、アプリ メソッドには [外部コード] ノードを含めることもできます。 列の値の詳細を次に示します。
CPU の合計は、関数とその関数によって呼び出された関数によって実行された作業の量を示します。 合計 CPU 値が高い場合は、全体的に最もコストの高い関数を指します。
セルフ CPU は、関数本体のコードによって実行された作業の量を示します。ただし、関数によって呼び出された関数によって実行された作業は除きます。 高い セルフ CPU 値は、関数自体のパフォーマンスのボトルネックを示している可能性があります。
モジュール 関数を含むモジュールの名前、または [外部コード] ノード内の関数を含むモジュールの数。
呼び出しツリー ビューで CPU の最も高い割合を使用する関数呼び出しを表示するには、[ホット パスの展開]
クリックします。 ホット パスは、最も影響が大きい領域に調査を集中するのに役立ちます。 手記
呼び出しツリーに "壊れた" コードまたは "ウォーク不能なスタック" としてマークされたコードが表示される場合は、それが Windows イベント トレーシング (ETW) イベントが削除された可能性を示しています。 同じトレースをもう一度収集して問題を解決してみてください。
データの別のビューを表示するには、ウィンドウの上部にあるドロップダウン リストから [Flame Graph
選択します。 炎グラフは、データの分析に役立つ可能性のある呼び出しツリーの別の視覚化を提供します。 詳細については、「炎グラフを使用してホット パスを識別する」を参照してください。
外部コードを表示する
外部コードは、記述するコードによって実行されるシステムおよびフレームワーク コンポーネントの関数です。 外部コードには、アプリの起動と停止、UI の描画、スレッド処理の制御、アプリへのその他の低レベルサービスの提供を行う関数が含まれています。 ほとんどの場合、外部コードには関心がないため、CPU 使用率ツールはユーザー メソッドの外部関数を 1 つの [外部呼び出し] ノードに収集します。
外部コードの呼び出しパスを表示する場合は、[
外部コードは、記述するコードによって実行されるシステムおよびフレームワーク コンポーネントの関数です。 外部コードには、アプリの起動と停止、UI の描画、スレッド処理の制御、アプリへのその他の低レベルサービスの提供を行う関数が含まれています。 ほとんどの場合、外部コードには関心がないため、CPU 使用率ツールはユーザー メソッドの外部関数を 1 つの [外部コード] ノードに収集します。
外部コードの呼び出しパスを表示する場合は、[
多くの外部コード呼び出しチェーンが深く入れ子になっているため、関数名列の幅は、コンピューター モニターの最大を超えるすべての表示幅を超える可能性があることに注意してください。 この場合、関数名は [...]
検索ボックスを使用して探しているノードを見つけ、水平スクロール バーを使用してデータを表示します。
ヒント
Windows 関数を呼び出す外部コードをプロファイリングする場合は、最新の .pdb ファイルがあることを確認する必要があります。 これらのファイルがない場合、レポート ビューには、難解で理解しにくい Windows 関数名が一覧表示されます。 必要なファイルがあることを確認する方法の詳細については、「デバッガーでシンボル (.pdb) ファイルとソース ファイルを指定する」を参照してください。
次の手順
このチュートリアルでは、CPU 使用率データを収集して分析する方法について説明しました。 プロファイラーの
ケース スタディ: コード の最適化に関する初心者向けガイド
このチュートリアルでは、デバッグ中に CPU 使用率データを収集して分析する方法を学習しました。 パフォーマンス プロファイラーを使用したリリース ビルドのプロファイリングの詳細を確認できます。
パフォーマンス プロファイラー で CPU 使用率を分析する