跳到主内容

使用 CPU 性能分析器视图

了解如何使用 DevTools CPU 性能分析器视图。

CPU 性能分析器视图允许您从 Dart 或 Flutter 应用程序中记录和分析会话。该分析器可以帮助您解决性能问题,或全面了解应用的 CPU 活动。Dart 虚拟机 (VM) 会收集 CPU 样本(即在单个时间点对 CPU 调用栈的快照),并将数据发送到 DevTools 进行可视化。通过聚合大量的 CPU 样本,分析器可以帮助您了解 CPU 将大部分时间花在了哪里。

CPU 性能分析器

#

点击 Record(记录)即可开始记录 CPU 配置文件。记录完成后,点击 Stop(停止)。此时,CPU 性能分析数据会从 VM 中提取出来,并显示在分析器视图(调用树、自下而上、方法表和火焰图)中。

若要加载所有可用的 CPU 样本而无需手动进行记录和停止,您可以点击 Load all CPU samples(加载所有 CPU 样本),这会提取 VM 已记录并存储在其样本缓冲区中的所有 CPU 样本,并在性能分析器视图中显示这些样本。

默认情况下,VM 的样本缓冲区用作环形缓冲区,这意味着一旦填满,新样本就会开始覆盖缓冲区中最旧的样本。若要让 VM 丢弃样本缓冲区填满后收集的所有样本,请将 --profile-startup 标志传递给 dart runflutter run

自下而上 (Bottom up)

#

此表提供了 CPU 配置文件的自下而上表示形式。这意味着自下而上表中的每个顶级方法(即根节点)实际上是一个或多个 CPU 样本调用栈中的顶部方法。换句话说,自下而上表中的每个顶级方法都是从上而下表(调用树)中的叶节点。在此表中,可以展开方法以查看其调用者

此视图有助于识别 CPU 配置文件中耗时较长的方法。当此表中的根节点具有较高的自用时间 (self time) 时,意味着在此配置文件中,许多 CPU 样本结束时该方法位于调用栈的顶部。

Screenshot of the Bottom-up view 请参阅下方的指南部分,了解如何启用图中所示的蓝色和绿色垂直线。

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

总耗时 (Total time)

对于自下而上树中的顶级方法

(位于至少一个 CPU 样本顶部的栈帧),这是该方法执行自身代码以及它调用的任何方法代码所花费的时间。

自用耗时 (Self time)

对于自下而上树中的顶级方法

(位于至少一个 CPU 样本顶部的栈帧),这是该方法仅执行自身代码所花费的时间。

对于自下而上树中的子方法(调用者),这是当通过子方法(调用者)调用顶级方法(被调用者)时,顶级方法的自用时间。

表格元素(自用耗时) Screenshot of a bottom-up table

调用树 (Call tree)

#

此表提供了 CPU 配置文件的从上而下表示形式。这意味着调用树中的每个顶级方法都是一个或多个 CPU 样本的根节点。在此表中,可以展开方法以查看其被调用者

此视图有助于识别 CPU 配置文件中耗时较长的路径。当此表中的根节点具有较高的耗时时,意味着在此配置文件中,许多 CPU 样本开始时该方法位于调用栈的底部。

Screenshot of a call tree table 请参阅下方的指南部分,了解如何启用图中所示的蓝色和绿色垂直线。

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

总耗时 (Total time)

方法执行自身代码以及

它调用的任何方法代码所花费的时间。

自用耗时 (Self time)

方法仅执行自身代码所花费的时间。

方法表 (Method table)

#

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

总耗时是方法出现在调用栈上的任何位置所花费的总时间,换句话说,即该方法执行自身代码以及它所调用的任何方法代码所花费的时间。

自用耗时是方法处于调用栈顶部所花费的总时间,换句话说,即该方法仅执行自身代码所花费的时间。

Screenshot of a call tree table

从左侧表中选择一种方法会显示该方法的调用图。调用图显示了方法的调用者和被调用者,以及它们各自的调用者/被调用者百分比。

火焰图 (Flame chart)

#

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

与调用树一样,此视图有助于识别 CPU 配置文件中耗时较长的路径。

Screenshot of a flame chart

帮助菜单可以通过点击搜索栏旁边的 ? 图标打开,它提供了有关如何在该图表中导航和缩放的信息以及颜色编码的图例。 Screenshot of flame chart help

CPU 采样率

#

DevTools 设置了一个 VM 收集 CPU 样本的速率:1 个样本 / 250 μs(微秒)。此项在 CPU 性能分析器页面上默认选择为 "Cpu sampling rate: medium"(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

指南

#

在查看调用树或自下而上视图时,树有时会非常深。为了方便查看深度树中的父子关系,请启用 Display guidelines(显示参考线)选项。这会在树中的父级和子级之间添加垂直参考线。

Screenshot of display options

其他资源

#

要了解如何使用 DevTools 分析计算密集型 Mandelbrot 应用的 CPU 使用情况,请查看指导性的 CPU 性能分析器视图教程。此外,还可以了解当应用程序使用隔离区 (isolates) 进行并行计算时,如何分析 CPU 使用情况。