Visual Studio で .NET アプリケーションをインストルメント化する (C#、C++、Visual Basic、F#)

Visual Studio 2022 バージョン 17.5 のリリースでは、新しい動的インストルメンテーション ツールを使用できます。 このツールでは、関数が呼び出された正確な回数が示され、以前のバージョンのインストルメンテーション ツールよりも高速です。 このツールでは、PDB を必要とすることなく .NET Core インストルメンテーションがサポートされます。 Visual Studio 2022 バージョン 17.6 Preview 2 以降、このツールでは C/C++ もサポートされています。

このツールは CPU 使用率ツールに似ていますが、CPU 使用率ではなく実時間に基づいている点が異なります。 これは、CPU 使用率ツールとは異なり、ロックの待機に費やされた時間などのブロックされた時間がインストルメンテーション トレースに表示されることを意味します。 インストルメンテーション ツールの効果的な使用方法の詳細については、「新しいインストルメンテーション ツールの概要」と「新しいインストルメンテーション ツールを使用して Visual Studio のパフォーマンスを向上させる」の記事をご覧ください。

アプリケーションをインストルメント化する

  1. Alt+F2 キー (または [デバッグ] > [パフォーマンス プロファイラー]) を選択して、Visual Studio でパフォーマンス プロファイラーを開きます。

  2. [インストルメンテーション] チェック ボックスをオンにします。

    選択されたインストルメンテーション ツールを示すスクリーンショット。

    プロファイラーを起動する前に [コレクションを一時停止した状態で開始] オプションを有効にした場合、診断セッション ビューで [記録] ボタンを選択するまでデータは収集されません。

    Note

    ツールを選択できない場合は、他のすべてのツールのチェック ボックスをオフにします。これは一部のツールは単独で実行される必要があるためです。 複数のツールを一緒に実行する方法の詳細については、「複数のプロファイラー ツールの同時使用」を参照してください。

    それでもツールを使用できない場合は、プロジェクトが前述の要件を満たしていることを確認します。 プロジェクトが最も正確なデータを取得するためのリリース モードになっていることを確認します。

  3. [開始] ボタンを選択してツールを実行します。

  4. インストルメント化するプログラムの項目を選択します。

    [インストルメント化する項目の選択] ダイアログを示すスクリーンショット。

    Visual Studio 2022 バージョン 17.11 Preview 1 以降では、プロファイラーは次のプロファイリング実行のために選択した項目を保持します。

  5. [OK] を選択します。

  6. ツールの実行が開始されたら、アプリ内でプロファイリングするシナリオを検討します。 次に、 [収集の停止] を選択するかアプリを閉じてデータを確認します。

インストルメンテーション レポートを分析する

プロファイル データが Visual Studio に表示されます。

.NET インストルメンテーション データを示すスクリーンショット。

インストルメンテーション データ ビューには、実行時間順に並べ替えられた関数の一覧が表示され、実行時間が最も長い関数が [上位の関数] の一番上に示されます。 [ホット パス] セクションには、ほとんどの時間を使っている関数の呼び出し履歴が表示されます。 これらの一覧は、パフォーマンス上のボトルネックが発生している関数を見つけるのに役立ちます。

関心のある関数をクリックすると、より詳細なビューが表示されます。

利用可能なデータは CPU 使用率ツールに似ていますが、CPU 使用率ではなく、実時間および呼び出し回数に基づいています。

分析情報を分析する

トップ インサイト セクションにインサイトが表示された場合は、提供されているリンクを使用して、特定された問題に関する詳細情報を取得します。 詳細については、 CPU の分析情報を参照してください。ただし、インストルメンテーション ツールの情報は、CPU 使用率ではなく、ウォール クロック時間に固有のものであることに注意してください。

さらに、Copilot を使用している場合は、 「Copilot に質問」 ボタンを使用して Copilot チャット ウィンドウを開くと、Copilot はコードの検査と特定された問題に基づいて提案を提供します。

計測の詳細レポートを分析する

インストルメンテーション レポートを分析するには、 [詳細を開く]をクリックするか、上位の機能の 1 つをクリックして [機能] ビューを開きます。

レポートには、診断データのさまざまなビューが示されます。

  • 呼び出し元/呼び出し先
  • コール ツリー
  • モジュール
  • 関数
  • フレーム グラフ

発信者/着信者を除くすべてのビューでは、診断レポートは 合計 [単位、%]で最高から最低の順に並べ替えられます。 並べ替え順序または並べ替え列を変更するには、列ヘッダーを選択します。 目的の関数をダブルクリックすると、関数のソースと、その関数に費やされた時間を示す強調表示が表示されます。 テーブルには、呼び出された関数を含む関数で費やされた時間 (合計) などのデータを含む列と、呼び出された関数を除いた関数で費やされた時間 (自己) を示す 2 番目の列が表示されます。

このデータは、関数自体がパフォーマンスのボトルネックであるかどうかを評価するのに役立ちます。 サード パーティのコードまたはランタイム ライブラリがエンドポイントの速度低下やリソース消費量の多い理由であるかどうかを確認するために、メソッドが表示するデータの量を決定します。

フレーム グラフの使用について詳しくは、「フレーム グラフを使用してホット パスを識別する」を参照してください。

インストルメンテーション呼び出しツリー

コール ツリーを表示するには、レポートの親ノードを選択します。 デフォルトでは、 インストルメンテーション ページが開き、 呼び出し元/呼び出し先 ビューが表示されます。 [現在のビュー] ドロップダウンで [コール ツリー] を選択します。 コールツリー ビューを使用すると、パフォーマンスのボトルネックをすばやく特定できます。

「ホット パスの展開」 ボタンと 「ホット パスの表示」 ボタンをクリックすると、呼び出しツリー ビューで最も多くのウォール クロック時間を使用する関数呼び出しが表示されます。

呼び出しツリー構造を示すスクリーンショット。

列値の詳細は次のようになります。

  • 合計 は、関数とそれによって呼び出された関数に費やされた時間を示します。 合計 値が高い場合、最も多くのクロック時間を消費している関数が示されます。

  • Self は、関数本体で費やされた時間を示します。ただし、関数本体によって呼び出された関数で費やされた時間は除きます。 Self 値が高い場合、関数自体にパフォーマンスのボトルネックが発生している可能性があります。

  • 呼び出し回数 は関数が呼び出された回数を示します。

  • モジュール 関数を含むモジュールの名前。