聚焦火焰图

使用突出焦点过滤条件时,您需要选择一个函数,然后火焰图会显示所有流入和流出该特定函数的代码路径。借助聚焦的图表,您可以执行以下两项常见任务:

  1. 分析可从多个位置调用的指定函数的整体资源耗用情况。
  2. 分析函数的不同调用者花费在函数上的时间比例。

例如,如何使用标准火焰图分析 Sort 函数的资源耗用情况呢?

火焰图中的 Sort 函数。

在下一部分,我们将聚焦 Sort 的火焰图并回答这个问题。此页面上的火焰图使用颜色模式构建,其比较对象分别设置为名称的默认值。

聚焦图表解析

根据突出焦点过滤条件生成的图表针对指定函数有效地创建了两个火焰图,并将这两个图联接在一起:

针对 sort 函数聚焦后的火焰图。

在上图中,与 Sort 函数对应的帧突出显示为全宽帧。该帧的文本包含了函数名称、百分比值以及分析所用的性能剖析文件数量。在本例中,这些指标表示 Sort 函数总共占用了 8.85% 的 CPU 时间。

上图的下半部分将函数 Sort 处理为标准火焰图的起点,并显示该函数的所有被调用者。您可以使用显示部分堆栈(从特定帧开始)过滤条件,以标准火焰图创建这一部分:

火焰图底部,显示 sort 函数的被调用者。

上图的上半部分显示 Sort 的调用者,并隐藏了被调用者。您可以通过一系列过滤条件获取上半部分的近似结果。 首先添加显示堆栈过滤条件 Sort。接下来,对于 Sort 调用的每个函数,添加隐藏堆栈隐藏帧。在这种情况下,您可以添加隐藏堆栈过滤条件 quickSort 以删除此函数及其子项,然后添加隐藏帧过滤条件 LenmaxDepth

火焰图顶部,显示 sort 函数的调用者。

使用这些过滤条件,聚焦图表上半部分的近似结果显示 Sort 函数经由不同的调用堆栈到达。不过,这些指标不会累加,因此图表未显示 Sort 的整体指标耗用情况。

聚焦图表与仅组合两个近似结果的图表略有不同:

  • 聚焦函数 Sort 有一个帧。
  • 该聚焦函数帧会突出显示为全宽帧,且显示所有调用堆栈的汇总指标。
  • 存在多个调用堆栈,每个调用堆栈均以 root 帧开头,因此您可以查看整个调用堆栈。

选择帧

如果您选择聚焦图表中的某个帧,系统会重绘火焰图,同时会更详细地显示该帧的调用堆栈。如果经由多个调用堆栈到达该帧,此时会显示其中每一个调用堆栈。不包含该帧的调用堆栈会在视图中隐藏。如需将图表恢复到原始状态,请选择与聚焦函数对应的帧。

在前面的示例中,Sort(*byFreq).sort(*byLiteral).sort 调用。若要更详细地查看 (*byLiteral).sort 的调用堆栈,请选择该帧。您可以选择另一个帧,并进一步优化所显示的调用堆栈:

展开的火焰图,显示有关 sort 函数的调用情况。

如需将聚焦的火焰图恢复为原始状态,请选择显示突出焦点过滤条件值的帧。在本例中,选择带有 Sort 标签的灰色帧。注意:要将标准火焰图恢复为原始状态,请选择根帧。

分析图表

要对聚焦火焰图进行分析,请使用您用于分析标准火焰图的相同控件和过滤条件。不过,火焰图与指针的交互方式会有所不同:

  • 如果指针悬停在某个帧上,则提示工具会显示指标数据。 对于标准火焰图,会显示帧的总指标数据。 对于聚焦的火焰图,会显示相应函数的聚合指标数据。

  • 如果您选择某个帧,系统会重新绘制火焰图并以全宽方式显示相应帧。要将标准火焰图恢复为原始状态,您必须选择顶层帧。要将聚焦的火焰图恢复为原始状态,您必须选择显示聚焦过滤条件值的帧。

如需了解比较性能剖析文件时的聚焦图表,请转到聚焦比较

设置聚焦过滤条件

您可以使用不同的方法设置聚焦过滤条件,但它们会生成相同的图表。

通过图表设置

将指针放在感兴趣的帧上,然后点击帧提示中的突出焦点。 聚焦函数即会从帧中提取。 在此示例中,火焰图围绕 (*huffmanBitWriter).write 函数展开,展示了三种不同的调用堆栈:

聚焦到一个极小的帧时的火焰图。

通过聚焦列表设置

要将火焰图聚焦到某个特定的函数,请执行以下操作:

  1. 点击列表 以打开选择聚焦函数 (Select focus function) 表。
  2. 从表中选择函数名称,或者,对于特定函数,点击操作 ,然后选择突出焦点

选择聚焦函数表。

如果您选择的函数可通过不同的调用堆栈调用,那么每个调用堆栈都会显示在火焰图中。

您可以选择表标头元素,按升序 或降序 对表行进行排序。表中的每一行都显示了一个函数名称及与该函数执行相关的统计信息。 此表显示了执行 (*compressor).deflate 函数需要 2.78 秒,其中 1.8 秒花费在函数本身上,而剩余时间则花费在其调用堆栈上。百分比列报告总执行时间的 57% 花费在函数 (*compressor).deflate 上,而这其中 89% 的时间花费在执行 (*compressor).deflate 或其调用堆栈中的某个函数上。最后,计数列报告有三个序列调用了函数 (*compressor).deflate

在比较剖析文件时,聚焦列表的内容是不同的。 如需了解详情,请参阅重点突出比较结果

通过过滤栏设置

点击过滤栏中的灰色文本添加性能剖析文件数据过滤条件,然后输入可识别要聚焦的函数的 Focus: 和相应字符串。您可以使用包含包前缀或完整名称的子字符串。如果您提供的字符串有歧义,则系统会选择与该字符串最匹配的函数。

您也可以根据需要点击过滤条件,选择聚焦,然后输入标识字符串。

如果您选择的函数可通过不同的调用堆栈调用,那么每个调用堆栈都会显示在火焰图中。

移除聚焦过滤条件

如需移除聚焦过滤条件,请点击过滤条件上的关闭

后续步骤