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。此外,还可以学习当应用使用 isolates 进行并行计算时如何分析 CPU 使用情况。