フレームグラフをフォーカスする

フォーカス フィルタを使用して 1 個の関数を選択すると、その特定の関数の呼び出し元、呼び出し先のコードパスがフレームグラフに表示されます。フォーカスしたグラフでは、次の 2 つの一般的なタスクを行うことができます。

  1. 複数の場所から呼び出される特定の関数のリソース消費量の合計を分析する場合
  2. 関数の複数の呼び出し元について、関数の実行に要した時間の割合を分析する場合

たとえば、標準のフレームグラフで Sort 関数周辺のリソース消費量を分析してみましょう。

フレームグラフに表示された Sort 関数。

次のセクションでは、グラフの Sort にフォーカスしてこの疑問に対する回答を得ます。このページのフレームグラフは、[カラーモード] と [比較対象] をそれぞれデフォルト値の [Name] と [None] に設定して作成しています。

フォーカスしたグラフの説明

では、フォーカス フィルタを使用してみましょう。このフィルタを使用すると、指定された関数に 2 つのフレームグラフが作成され、結合されます。

Sort 関数にフォーカスしたフレームグラフ。

上のグラフでは、Sort 関数に対応するフレームが全幅でハイライト表示されています。フレーム テキストには、関数名と、分析で使用されたプロファイルの割合と数値が含まれています。ここでは、Sort 関数が合計で CPU 時間の 8.85% を消費したことを示す指標が表示されています。

上のグラフの下半分では、Sort 関数が標準のフレームグラフの起点となり、その関数のすべての呼び出し先が表示されます。標準のフレームグラフでこの部分を作成するには、[フレームから表示] フィルタを使用します。

Sort の呼び出し先を示すフレームグラフの下半分。

グラフの上半分には Sort の呼び出し元が表示されますが、呼び出し先は非表示になっています。一連のフィルタを使用して、上半分の概要を得ることができます。まず、Sort の [スタックを表示] フィルタを追加します。次に、Sort によって呼び出される各関数に対して、[スタックを非表示] または [フレームを非表示] を追加します。この状況で、quickSort の [スタックを非表示] を追加して、この関数とその子を非表示にしてから、LenmaxDepth の [フレームを非表示] を追加します。

Sort の呼び出し元を示すフレームグラフの上半分。

これらのフィルタを使用すると、フォーカスしたグラフの上半分の概要部分に、Sort 関数に到達するまでにさまざまなコールスタックを経由していることが示されます。ただし、指標は集計されないため、グラフは Sort で消費された指標全体を示すものではありません。

フォーカスしたグラフは、2 つの概要部分を単に組み合わせたグラフとは少し異なります。

  • フォーカス関数 Sort のためのフレームが 1 つ用意されます。
  • フォーカス関数のフレームはハイライト表示され、全幅フレームとなり、すべてのコールスタックを集計した指標が表示されます。
  • それぞれ root フレームで始まる複数のコールスタックがあるため、コールスタック全体を確認できます。

フレームを選択する

フォーカスしたグラフ内でフレームを選択すると、フレームグラフが再描画されて、そのフレームのコールスタックの詳細が表示されます。そのフレームに到達するコールスタックが複数存在する場合は、個々のコールスタックが表示されます。そのフレームが含まれていないコールスタックは表示されません。グラフを元の状態に戻すには、フォーカス関数に対応するフレームを選択します。

前の例では、Sort(*byFreq).sort(*byLiteral).sort によって呼び出されます。(*byLiteral).sort のコールスタックの詳細を表示するには、そのフレームを選択します。別のフレームを選択して、表示するコールスタックを絞り込むこともできます。

Sort を中心に拡大したフレームグラフ。

フォーカスしたフレームグラフを元の状態に戻すには、フォーカス フィルタの値が表示されているフレームを選択します。ここでは、Sort というラベルの付いた灰色のフレームを選択します。標準のフレームグラフを元の状態に戻すには、ルートフレームを選択します。

グラフを分析する

フォーカスしたフレームグラフを分析するには、標準のフレームグラフの場合と同じコントロールとフィルタを使用します。ただし、グラフとポインタの間の動作に違いがあります。

  • ポインタをフレームの上に合わせると、ツールチップに指標データが表示されます。標準のフレームグラフの場合、フレームの指標データの合計が表示されます。フォーカスしたフレームグラフの場合、関数の指標データの集計が表示されます。

  • フレームを選択すると、フレームグラフが再描画されて、そのフレームが全幅で表示されます。標準のフレームグラフを元のフォームに戻すには、最上部のフレームを選択します。フォーカスしたフレームグラフを元のフォームに戻すには、フォーカス フィルタの値が表示されているフレームを選択します。

プロファイル比較時のフォーカスしたグラフの詳細については、比較にフォーカスするをご覧ください。

フォーカス フィルタを設定する

フォーカス フィルタを設定する方法はいくつかありますが、作成されるグラフは同じです。

グラフを使用

目的のフレームにポインタを置き、フレーム ツールチップの [フォーカス] をクリックします。フレームからフォーカス関数が抽出されます。次のフレームグラフでは、関数 (*huffmanBitWriter).write が展開され、3 つの異なるコールスタックが表示されています。

小さなフレームにフォーカスしたフレームグラフ。

フォーカス リストを使用

フレームグラフで特定の関数をフォーカスするには、次の手順を行います。

  1. [リスト] をクリックして、[フォーカスする関数を選択] テーブルを開きます。
  2. テーブルから関数名を選択します。特定の関数の場合は、[アクション] をクリックしてから [フォーカス] を選択します。

[フォーカスする関数を選択] テーブル。

選択した関数が別のコールスタックから呼び出される場合は、それぞれのコールスタックがフレームグラフに表示されます。

テーブルのヘッダー要素を選択すると、テーブルの行を昇順 または降順 に並べ替えられます。テーブルの各行には、関数名とその関数の実行に関連する統計情報が表示されます。このテーブルは、(*compressor).deflate 関数の実行に 2.78 秒が必要とされることを示しています。関数自体には 1.8 秒かかり、残りの時間はコールスタックに消費されています。1 つのパーセントの列は、関数 (*compressor).deflate が総実行時間の 57% を占めていることを表しています。別の列は、(*compressor).deflate または関連するコールスタックの関数の実行に 89% の時間が費やされていることを表しています。右端の件数の列は、関数 (*compressor).deflate を呼び出すシーケンスが 3 つあることを示しています。

プロファイル比較時には、フォーカス リストの内容が異なります。詳しくは、比較をフォーカスするをご覧ください。

フィルタバーを使用

フィルタバーにある灰色の [プロファイル データのフィルタを追加] をクリックして、「Focus:」と入力し、フォーカスする関数名を入力します。パッケージ プレフィックスなどの部分的な文字列を使用することも、完全な名前を使用することもできます。あいまいな文字列を指定すると、一致度の最も高い関数が選択されます。

また、[フィルタ] をクリックして [フォーカス] を選択し、文字列を入力することもできます。

選択した関数が別のコールスタックから呼び出される場合は、それぞれのコールスタックがフレームグラフに表示されます。

フォーカス フィルタを削除する

フォーカス フィルタを削除するには、フィルタラベルの [閉じる] をクリックします。

次のステップ