使用 CPU 分析器视图

CPU 分析器视图允许您记录和分析 Dart 或 Flutter 应用中的会话。分析器可以帮助您解决性能问题或了解应用的 CPU 活动。Dart VM 收集 CPU 样本(某个时间点的 CPU 调用堆栈快照),并将数据发送到 DevTools 进行可视化。通过聚合多个 CPU 样本,分析器可以帮助您了解 CPU 花费大部分时间的位置。

CPU 分析器

通过点击记录开始记录 CPU 分析。记录完成后,点击停止。此时,CPU 分析数据将从 VM 中提取并显示在分析器视图中(调用树、自下而上、方法表和火焰图)。

要加载所有可用的 CPU 样本,而无需手动记录和停止,您可以点击加载所有 CPU 样本,这将提取 VM 记录并存储在其环形缓冲区中的所有 CPU 样本,然后在分析器视图中显示这些 CPU 样本。

自下而上

此表提供了 CPU 分析的自下而上表示。这意味着自下而上表中的每个顶级方法或根实际上是 CPU 样本调用堆栈中的顶级方法。换句话说,自下而上表中的每个顶级方法都是自上而下表(调用树)的叶节点。在此表中,可以展开一个方法以显示其调用方

此视图对于识别 CPU 分析中的昂贵方法非常有用。当此表中的根节点具有较高的自身时间时,这意味着此分析中的许多 CPU 样本以该方法作为调用堆栈的顶部结束。

自下而上视图的屏幕截图请参阅下面的指南部分,了解如何启用此图像中看到的蓝色和绿色垂直线。

工具提示可以帮助您理解每列中的值

总时间
对于自下而上树中的顶级方法(至少一个 CPU 样本顶部的堆栈帧),这是该方法执行其自身代码以及它所调用的任何方法的代码所花费的时间。
自身时间
对于自底向上树中的顶级方法(位于至少一个 CPU 样本顶部的堆栈帧),这是该方法仅执行其自身代码所花费的时间。

对于自底向上树中的子方法(调用方),这是通过子方法(调用方)调用时顶级方法(被调用方)的自身时间。

表格元素(自身时间)自底向上表格的屏幕截图

调用树

此表格提供了 CPU 配置文件的自顶向下表示。这意味着调用树中的每个顶级方法都是一个或多个 CPU 样本的根。在此表格中,可以展开一个方法以显示其被调用方

此视图对于识别 CPU 配置文件中的昂贵路径很有用。当此表格中的根节点具有较高的时间时,这意味着此配置文件中的许多 CPU 样本都以该方法作为调用堆栈的底部开始。

调用树表格的屏幕截图请参阅下面的指南部分,了解如何启用此图像中看到的蓝色和绿色垂直线。

工具提示可以帮助您理解每列中的值

总时间
方法执行其自身代码以及它调用的任何方法的代码所花费的时间。
自身时间
方法仅执行其自身代码所花费的时间。

方法表格

方法表格提供了 CPU 配置文件中包含的每个方法的 CPU 统计信息。在左侧的表格中,列出了所有可用方法及其时间和自身时间。

时间是方法在调用堆栈的任何位置花费的总时间,换句话说,是方法执行其自身代码和它调用的任何方法的代码所花费的时间。

自身时间是方法在调用堆栈顶部花费的总时间,换句话说,是方法仅执行其自身代码所花费的时间。

Screenshot of a call tree table

从左侧表格中选择一个方法将显示该方法的调用图。调用图显示了方法的调用方和被调用方及其各自的调用方/被调用方百分比。

火焰图

火焰图视图是调用树的图形表示。这是 CPU 配置文件的自顶向下视图,因此在此图表中,最顶层的方法调用其下方的那个方法。每个火焰图元素的宽度表示方法在调用堆栈上花费的时间量。

与调用树一样,此视图对于识别 CPU 配置文件中的昂贵路径很有用。

Screenshot of a flame chart

可以通过单击搜索栏旁边的?图标打开帮助菜单,该菜单提供有关如何在图表中导航和缩放以及颜色编码图例的信息。火焰图帮助的屏幕截图

CPU 采样率

DevTools 设置了 VM 收集 CPU 采样的默认速率:1 个采样/250 μs(微秒)。这在 CPU 分析器页面上默认选择为“CPU 采样率:中等”。可以使用页面顶部的选择器修改此速率。

Screenshot of cpu sampling rate menu

中等采样率分别为 1,000 Hz、4,000 Hz 和 20,000 Hz。了解修改此设置的权衡取舍非常重要。

使用较高采样率记录的分析会生成更精细的 CPU 分析,其中包含更多采样。由于 VM 会更频繁地中断以收集采样,这可能会影响应用的性能。这还会导致 VM 的 CPU 采样缓冲区更快地溢出。VM 存储 CPU 采样信息的可用空间有限。在较高的采样率下,空间会填满,并比使用较低采样率时更快地开始溢出。这意味着你可能无法访问记录的分析开头的 CPU 采样,具体取决于记录期间缓冲区是否溢出。

使用较低采样率记录的分析会生成更粗略的 CPU 分析,其中包含较少采样。这会较少影响应用的性能,但你可能无法访问有关 CPU 在分析期间执行的操作的更多信息。VM 的采样缓冲区也会更慢地填满,因此你可以看到更长时间的应用运行时 CPU 采样。这意味着你有更大的机会查看记录的分析开头的 CPU 采样。

过滤

在查看 CPU 分析时,你可以按库、方法名称或 UserTag 过滤数据。

Screenshot of filter by tag menu

指南

在查看调用树或自下而上视图时,有时树可能非常深。要帮助查看深层树中的父子关系,请启用显示指南选项。这会在树中的父子之间添加垂直指南。

Screenshot of display options

其他资源

要了解如何使用 DevTools 分析计算密集型 Mandelbrot 应用程序的 CPU 使用情况,请查看指导性 CPU Profiler View 教程。此外,了解当应用程序使用隔离进行并行计算时如何分析 CPU 使用情况。