使用 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 统计信息。在左侧的表中,列出了所有可用方法的总时间和自时间。
总时间是指方法在调用堆栈的任何位置所花费的总时间,换句话说,就是方法执行自身代码以及它调用的任何方法代码所花费的时间。
自时间是指方法处于调用堆栈顶部所花费的总时间,换句话说,就是方法仅执行自身代码所花费的时间。
从左侧表中选择一个方法会显示该方法的调用图。调用图显示了方法的调用方和被调用方及其各自的调用方/被调用方百分比。
火焰图
#火焰图视图是调用树的图形表示。这是一个 CPU 剖析的自顶向下视图,因此在此图中,最顶层的方法调用其下方的那个方法。每个火焰图元素(火焰)的宽度表示该方法在调用堆栈上花费的时间。
与调用树类似,此视图有助于识别 CPU 剖析中的昂贵路径。
帮助菜单(可通过点击搜索栏旁边的 ?
图标打开)提供了有关如何在图表中导航和缩放的信息,以及一个颜色编码的图例。
CPU 采样率
#DevTools 设置了 VM 收集 CPU 采样的速率:1 个采样 / 250 μs(微秒)。在 CPU 剖析器页面上,此选项默认选择为“CPU 采样率:中”。可以使用页面顶部的选择器修改此速率。
低、中和高采样率分别为 1,000 Hz、4,000 Hz 和 20,000 Hz。了解修改此设置的权衡很重要。
以较高采样率录制的剖析会产生更精细的 CPU 剖析,具有更多的采样点。这可能会影响应用的性能,因为 VM 会更频繁地中断以收集采样。这还会导致 VM 的 CPU 采样缓冲区更快溢出。VM 存储 CPU 采样信息的空间是有限的。在较高的采样率下,空间会填满并比使用较低采样率时更快开始溢出。这意味着,取决于缓冲区在录制过程中是否溢出,您可能无法访问录制剖析开头部分的 CPU 采样。
以较低采样率录制的剖析会产生更粗粒度的 CPU 剖析,采样点较少。这会较少影响您的应用性能,但您可能无法获得有关 CPU 在剖析期间执行的操作的足够信息。VM 的采样缓冲区也会更慢地填满,因此您可以查看更长时间的应用运行时间的 CPU 采样。这意味着您更有可能查看录制剖析开头部分的 CPU 采样。
过滤
#在查看 CPU 剖析时,您可以按库、方法名或 UserTag
过滤数据。
指南
#查看调用树或从下往上视图时,树有时会非常深。为了帮助查看深层树中的父子关系,请启用显示指南选项。这将为树中的父子之间添加垂直指南。
其他资源
#要了解如何使用 DevTools 分析计算密集型 Mandelbrot 应用的 CPU 使用情况,请查看分步教程 CPU Profiler View。此外,还可以学习当应用使用 isolates 进行并行计算时如何分析 CPU 使用情况。