使用 CPU 分析器视图
了解如何使用 DevTools CPU 分析器视图。
CPU 分析器视图允许您记录和分析来自 Dart 或 Flutter 应用程序的会话。分析器可以帮助您解决性能问题或通常了解应用程序的 CPU 活动。Dart VM 收集 CPU 样本(在单个时间点的 CPU 调用堆栈的快照),并将数据发送到 DevTools 进行可视化。通过汇总许多 CPU 样本,分析器可以帮助您了解 CPU 花费最多时间的地方。
CPU 分析器
#通过单击 记录 开始记录 CPU profile。完成记录后,单击 停止。此时,CPU profiling 数据从 VM 中提取并显示在分析器视图中(调用树、自下而上、方法表和火焰图)。
要加载所有可用的 CPU 样本,而无需手动记录和停止,您可以单击 加载所有 CPU 样本,这将提取 VM 已记录并存储在其样本缓冲区中的所有 CPU 样本,然后将这些 CPU 样本显示在分析器视图中。
默认情况下,VM 的样本缓冲区用作环形缓冲区,这意味着一旦缓冲区已满,新的样本将开始覆盖缓冲区中最旧的样本。要使 VM 而是丢弃样本缓冲区已满后收集的所有样本,请将 --profile-startup 标志传递给 dart run 或 flutter run。
自下而上
#此表提供 CPU profile 的自下而上的表示形式。这意味着自下而上表中的每个顶级方法或根实际上是多个 CPU 样本的调用堆栈顶部的顶级方法。换句话说,自下而上表中的每个顶级方法是自上而下表(调用树)中的叶节点。在此表中,可以展开一个方法以显示其 调用者。
此视图对于识别 CPU profile 中的昂贵 方法 非常有用。当此表中的根节点具有较高的 自耗时间 时,这意味着此 profile 中的许多 CPU 样本以该方法位于调用堆栈的顶部结束。
请参阅下面的 指南 部分,了解如何启用此图像中看到的蓝色和绿色垂直线。
工具提示可以帮助您理解每个列中的值
- 总时间
对于自下而上树中的顶级方法
(至少一个 CPU 样本位于顶部的堆栈帧),这是该方法花费在执行其自身代码以及其调用的任何方法代码上的时间。
- 自耗时间
对于自下而上树中的顶级方法
(至少一个 CPU 样本位于顶部的堆栈帧),这是该方法花费在执行其自身代码上的时间。
对于自下而上树中的子方法(调用者),这是顶级方法(被调用者)通过子方法(调用者)调用时的自耗时间。
表格元素(自耗时间) 
调用树
#此表提供 CPU profile 的自上而下的表示形式。这意味着调用树中的每个顶级方法是多个 CPU 样本的根。在此表中,可以展开一个方法以显示其 被调用者。
此视图对于识别 CPU profile 中的昂贵 路径 非常有用。当此表中的根节点具有较高的 总时间 时,这意味着此 profile 中的许多 CPU 样本以该方法位于调用堆栈的底部开始。
请参阅下面的 指南 部分,了解如何启用此图像中看到的蓝色和绿色垂直线。
工具提示可以帮助您理解每个列中的值
- 总时间
方法执行其自身代码以及
其调用的任何方法的代码所花费的时间。
- 自耗时间
方法花费在执行其自身代码上的时间。
方法表
#方法表提供 CPU profile 中包含的每个方法的 CPU 统计信息。在左侧的表格中,所有可用方法都列出了其 总时间 和 自耗时间。
总时间 是方法在调用堆栈上的 任何位置 所花费的组合时间,或者换句话说,方法花费在执行其自身代码和其调用的任何方法代码上的时间。
自耗时间 是方法位于调用堆栈顶部所花费的组合时间,或者换句话说,方法花费在执行其自身代码上的时间。
从左侧的表格中选择一个方法会显示该方法的调用图。调用图显示了方法的调用者和被调用者及其各自的调用者/被调用者百分比。
火焰图
#火焰图视图是 调用树 的图形表示形式。这是 CPU profile 的自上而下的视图,因此在此图中,最顶层的方法调用其下方的那个方法。每个火焰图元素的宽度表示方法在调用堆栈上花费的时间量。
与调用树一样,此视图对于识别 CPU profile 中的昂贵路径非常有用。
帮助菜单(可以通过单击搜索栏旁边的 ? 图标打开)提供有关如何在图表中导航和缩放以及颜色编码图例的信息。 
CPU 采样率
#DevTools 设置 VM 收集 CPU 样本的速率:1 样本 / 250 μs(微秒)。这默认在 CPU 分析器页面上选择为“Cpu 采样率:中等”。可以使用页面顶部的选择器修改此速率。
低、中 和 高 采样率分别为 1,000 Hz、4,000 Hz 和 20,000 Hz。了解修改此设置的权衡非常重要。
使用 更高的 采样率记录的 profile 会产生更细粒度的 CPU profile,其中包含更多的样本。这可能会影响应用程序的性能,因为 VM 会更频繁地中断以收集样本。这还会导致 VM 的 CPU 样本缓冲区更快地溢出。VM 具有存储 CPU 样本信息的有限空间。在较高的采样率下,空间会更快地填满,并开始溢出,而不是使用较低的采样率时。这意味着您可能无法访问记录 profile 的开始时的 CPU 样本,具体取决于缓冲区是否在记录期间溢出。
使用较低的采样率记录的 profile 会产生更粗粒度的 CPU profile,其中包含更少的样本。这会减少对应用程序性能的影响,但您可能无法获得有关 CPU 在 profile 期间执行的操作的更多信息。VM 的样本缓冲区也填充得更慢,因此您可以查看更长时间的应用程序运行时间的 CPU 样本。这意味着您更有可能查看记录 profile 开始时的 CPU 样本。
过滤
#在查看 CPU profile 时,您可以按库、方法名称或 UserTag 过滤数据。
指南
#在查看调用树或自下而上视图时,有时树可能非常深。为了帮助查看深度树中的父子关系,请启用 显示指南线 选项。这会在树中的父级和子级之间添加垂直指南线。
其他资源
#要了解如何使用 DevTools 分析计算密集型 Mandelbrot 应用程序的 CPU 使用情况,请查看引导式 CPU 分析器视图教程。 此外,了解如何分析应用程序使用 isolates 进行并行计算时的 CPU 使用情况。