フレームグラフをフォーカスする
フォーカス フィルタを使用して 1 個の関数を選択すると、その特定の関数の呼び出し元、呼び出し先のコードパスがフレームグラフに表示されます。フォーカスしたグラフでは、次の 2 つの一般的なタスクを行うことができます。
- 複数の場所から呼び出される特定の関数のリソース消費量の合計を分析する場合
- 関数の複数の呼び出し元について、関数の実行に要した時間の割合を分析する場合
たとえば、標準のフレームグラフで Sort
関数周辺のリソース消費量を分析してみましょう。
次のセクションでは、グラフの Sort
にフォーカスしてこの疑問に対する回答を得ます。このページのフレームグラフは、[カラーモード] と [比較対象] をそれぞれデフォルト値の [Name] と [None] に設定して作成しています。
フォーカスしたグラフの説明
では、フォーカス フィルタを使用してみましょう。このフィルタを使用すると、指定された関数に 2 つのフレームグラフが作成され、結合されます。
上のグラフでは、Sort
関数に対応するフレームが全幅でハイライト表示されています。フレーム テキストには、関数名と、分析で使用されたプロファイルの割合と数値が含まれています。ここでは、Sort
関数が合計で CPU 時間の 8.85% を消費したことを示す指標が表示されています。
上のグラフの下半分では、Sort
関数が標準のフレームグラフの起点となり、その関数のすべての呼び出し先が表示されます。標準のフレームグラフでこの部分を作成するには、[フレームから表示] フィルタを使用します。
グラフの上半分には Sort
の呼び出し元が表示されますが、呼び出し先は非表示になっています。一連のフィルタを使用して、上半分の概要を得ることができます。まず、Sort
の [スタックを表示] フィルタを追加します。次に、Sort
によって呼び出される各関数に対して、[スタックを非表示] または [フレームを非表示] を追加します。この状況で、quickSort
の [スタックを非表示] を追加して、この関数とその子を非表示にしてから、Len
と maxDepth
の [フレームを非表示] を追加します。
これらのフィルタを使用すると、フォーカスしたグラフの上半分の概要部分に、Sort
関数に到達するまでにさまざまなコールスタックを経由していることが示されます。ただし、指標は集計されないため、グラフは Sort
で消費された指標全体を示すものではありません。
フォーカスしたグラフは、2 つの概要部分を単に組み合わせたグラフとは少し異なります。
- フォーカス関数
Sort
のためのフレームが 1 つ用意されます。 - フォーカス関数のフレームはハイライト表示され、全幅フレームとなり、すべてのコールスタックを集計した指標が表示されます。
- それぞれ
root
フレームで始まる複数のコールスタックがあるため、コールスタック全体を確認できます。
フレームを選択する
フォーカスしたグラフ内でフレームを選択すると、フレームグラフが再描画されて、そのフレームのコールスタックの詳細が表示されます。そのフレームに到達するコールスタックが複数存在する場合は、個々のコールスタックが表示されます。そのフレームが含まれていないコールスタックは表示されません。グラフを元の状態に戻すには、フォーカス関数に対応するフレームを選択します。
前の例では、Sort
は (*byFreq).sort
と (*byLiteral).sort
によって呼び出されます。(*byLiteral).sort
のコールスタックの詳細を表示するには、そのフレームを選択します。別のフレームを選択して、表示するコールスタックを絞り込むこともできます。
フォーカスしたフレームグラフを元の状態に戻すには、フォーカス フィルタの値が表示されているフレームを選択します。ここでは、Sort
というラベルの付いた灰色のフレームを選択します。標準のフレームグラフを元の状態に戻すには、ルートフレームを選択します。
グラフを分析する
フォーカスしたフレームグラフを分析するには、標準のフレームグラフの場合と同じコントロールとフィルタを使用します。ただし、グラフとポインタの間の動作に違いがあります。
ポインタをフレームの上に合わせると、ツールチップに指標データが表示されます。標準のフレームグラフの場合、フレームの指標データの合計が表示されます。フォーカスしたフレームグラフの場合、関数の指標データの集計が表示されます。
フレームを選択すると、フレームグラフが再描画されて、そのフレームが全幅で表示されます。標準のフレームグラフを元のフォームに戻すには、最上部のフレームを選択します。フォーカスしたフレームグラフを元のフォームに戻すには、フォーカス フィルタの値が表示されているフレームを選択します。
プロファイル比較時のフォーカスしたグラフの詳細については、比較にフォーカスするをご覧ください。
フォーカス フィルタを設定する
フォーカス フィルタを設定する方法はいくつかありますが、作成されるグラフは同じです。
グラフを使用
目的のフレームにポインタを置き、フレーム ツールチップの [フォーカス] をクリックします。フレームからフォーカス関数が抽出されます。次のフレームグラフでは、関数 (*huffmanBitWriter).write
が展開され、3 つの異なるコールスタックが表示されています。
フォーカス リストを使用
フレームグラフで特定の関数をフォーカスするには、次の手順を行います。
- [リスト] list をクリックして、[フォーカスする関数を選択] テーブルを開きます。
- テーブルから関数名を選択します。特定の関数の場合は、[アクション] more_vert をクリックしてから [フォーカス] を選択します。
選択した関数が別のコールスタックから呼び出される場合は、それぞれのコールスタックがフレームグラフに表示されます。
テーブルのヘッダー要素を選択すると、テーブルの行を昇順 arrow_upward または降順 arrow_downward に並べ替えられます。テーブルの各行には、関数名とその関数の実行に関連する統計情報が表示されます。このテーブルは、(*compressor).deflate
関数の実行に 2.78 秒が必要とされることを示しています。関数自体には 1.8 秒かかり、残りの時間はコールスタックに消費されています。1 つのパーセントの列は、関数 (*compressor).deflate
が総実行時間の 57% を占めていることを表しています。別の列は、(*compressor).deflate
または関連するコールスタックの関数の実行に 89% の時間が費やされていることを表しています。右端の件数の列は、関数 (*compressor).deflate
を呼び出すシーケンスが 3 つあることを示しています。
プロファイル比較時には、フォーカス リストの内容が異なります。詳しくは、比較をフォーカスするをご覧ください。
フィルタバーを使用
フィルタバーにある灰色の [プロファイル データのフィルタを追加] をクリックして、「Focus:
」と入力し、フォーカスする関数名を入力します。パッケージ プレフィックスなどの部分的な文字列を使用することも、完全な名前を使用することもできます。あいまいな文字列を指定すると、一致度の最も高い関数が選択されます。
また、[フィルタ] をクリックして [フォーカス] を選択し、文字列を入力することもできます。
選択した関数が別のコールスタックから呼び出される場合は、それぞれのコールスタックがフレームグラフに表示されます。
フォーカス フィルタを削除する
フォーカス フィルタを削除するには、フィルタラベルの [閉じる] close をクリックします。