dotTrace 2024.3 ヘルプ

非同期呼び出しを分析する

非同期コードの欠点の 1 つは、プロファイルを作成してパフォーマンスを分析するのが難しいことです。これは、非同期メソッドが実行されると、制御が別のスレッドに切り替えられて戻るため、結果の呼び出しツリーがもつれているためです。

dotTrace は、非同期コードの分析を大幅に簡素化します。呼び出しツリー内のすべての async 呼び出しノードをマークし、対応する await 時間と継続コードをそのノードにグループ化します。つまり、異なる呼び出しスタックで検索するのではなく、非同期呼び出しのすべての「部分」を 1 か所ですばやく見つけることができます。

dotTrace が非同期コードをどのように処理するかを理解するには、次の例を考えてください(コードは左側に、対応する呼び出しツリーは右側に表示されています)。

Async calls analysis

ご覧のとおり、非同期呼び出しのすべての「部分」は async RunAsyncOperation ノード内に表示されています。

  • RunAsyncOperation の合計時間は次のように計算されます

    119 ミリ秒 = Init() 101 ミリ秒 + ReadAsync() 13 ミリ秒 + clr.dll 3.7 ミリ秒 + FileStream.ctor() 0.6 ミリ秒

  • Init メソッド(101ms)はメインスレッド上で実行されるため、その時間が RunAsyncOperation の合計時間に加算されます。

  • ReadAsync はメインスレッドで開始されますが (13 ミリ秒)、後続のタスクはスレッドプールで実行されます。タスクの実行ノードの時間 (819 ms) は灰色で表示され、RunAsyncOperation の合計時間には追加されません。

    Async calls task execution
  • この場合の待機時間はタスクの実行時間 (819 ミリ秒) と同じですが、実際には、タスクがスケジュールに待機する時間も含まれているため、それより長くなる可能性があります。

  • 継続ノードは継続コードで、この場合は単一の ProcessFile メソッド(301 ms)で構成されています。この呼び出しはスレッドプールで実行されるため、その時間も灰色で表示され、RunAsyncOperation の合計時間には加算されません。

継続コードのバックトレース

もちろん、継続コードの追跡は、コールバック関数だけでなく、元の async メソッドに戻ります。これは、継続コードが例外をスローし、その発生源を特定する必要がある場合などに非常に役立ちます。

Async call backtraces

非同期呼び出しの合計時間でフィルター処理する

非同期呼び出しの合計時間でフィルターを適用するには、呼び出しツリーの呼び出しノードをダブルクリックするか、ノード (またはその await または continuations ノード) を右クリックして、コンテキストメニューから非同期メソッドの分析を選択します。

async メソッドの呼び出し時間でフィルターを適用すると、dotTrace はメソッドが実行された時間間隔のみを残します。呼び出しツリーに表示される対応するチェックボックスを選択することで、継続コード間隔 (および await time ノード) を含めたり除外したりできることに注意してください。

Async await filter

継続コードが範囲外になるようにフィルターを適用する場合 (メインスレッドによるフィルターなど)、継続チェックボックスは表示されないことに注意してください。

コールツリーのタスク

前述の機能は、async/await だけでなく、Task クラスに基づくすべてのタスクで機能します。Run ノードには、タスクデリゲートを持つタスクの実行ノードが含まれています。

Async calls tasks

非同期の呼び出しとイベント

呼び出しツリーは、メモリ割り当てや例外など、タイムラインプロファイリングモードでサポートされている他のすべてのタイプのイベントだけでなく、呼び出し時間でも機能します。例: 特定の非同期メソッドが割り当てるメモリ量を表示できます。

Async calls allocations

関連ページ:

呼び出しツリー

呼び出しツリーはメソッド実行パスを示します。ツリー内の各メソッドノードは、特定のスレッドによって実行されるトップレベルのメソッドを表します。メソッドノードには、呼び出されたメソッドとプロファイリング時に収集されたメトリクスがリストされます。呼び出しツリーを使用して: アプリケーションアクティビティの簡単な概要を取得する: 最も「高額な」呼び出しを移動するまたはフレームグラフを使用します。最も遅いメソッド (最も時間がかかるメソッド、または頻繁に呼び出されるメソッド) の実行パスを次の方法で調べます。...

予測パフォーマンス

通常、パフォーマンスプロファイリングの主な目的は、アプリまたはアプリの特定の機能を減速させる方法を決定することです。しかし、このような方法を見つけたら、この特定の方法を最適化することでアプリのパフォーマンスが向上することを確認することは理にかなっています。dotTrace を使用すると、呼び出しツリーから任意のメソッドを除外して、「アプリにそのような機能がない場合はどうなりますか? 特定のコールスタックから 1 つのメソッド出現箇所だけを除外し、すべてのコールスタックからすべてのメソッド出現箇所を...