使用 CPU 探测视图

它是什么?

CPU 探测视图能够测量并记录你的 Dart 或 Flutter 应用的片段。

CPU 分析器

单击 Record 开始进行记录 CPU 信息,完成后点击 Stop 停止记录, CPU 分析器会把收集的信息推送到 VM,并分别在不同的信息窗口进行展示调用树(调用栈、从下到上的信息以及火焰图)。

分析粒度

VM 收集 CPU 样本的默认速率为 1/250μs (即每 250 微秒收集一次数据)。一般情况下,Profile granularity 的默认值为 “medium”。可以通过页面顶部下拉列表进行修改。抽样率低、中、高粒度分别顺序对应 1/50μs、1/250μs 和 1/1000μs。正确设定此值对性能分析非常重要。

高粒度 的配置会具有更高效的采样率,因此单元时间内采集的 CPU 信息会更加详细且采集样例更多。因些 VM 会被经常中断以收集样本数据,所以这有可能会影响你的应用程序的运行或导致性能下降。 VM 中 CPU 样例数据信息的存储空间是受限制的,所以也会导致 VM 的 CPU 示例缓冲区很快地填充满且会产生溢出。相对低采样率,高采样率存储空间会被迅速填满并会出现溢出。一旦空间溢出,就有可能导致采样数据丢失。

低粒度 的配置具有较低的采样率,因此单元时间内采集的 CPU 信息会比较粗略且采集样例较少。当然,这样也会对你的应用程序性能影响更小。 VM 示例缓冲区填充速度也会较慢,因此你可以采集到相当长一段时间内应用程序的 CPU 样例数据,这也意味着你有更好的机会去查看 CPU 样例数据。

火焰图表

火焰图选项卡主要用于显示一段持续时间内 CPU 的样本信息。图表展示的是自上而下的调用堆栈信息,即上面的堆栈帧调用下面的堆栈帧。每一个堆栈帧的宽度代表 CPU 执行的时长。栈帧消耗 CPU 的时间越长,就越洽有可能是我们进行性能改进的好地方。

Screenshot of a flame chart

调用树 (也叫跟踪树)

调用树视图是一种自上而下展示 CPU 中的调用堆栈信息方法。在下图中的表格中可以看出,展开其中的一个方法可以查看它所有的 调用者

总时间

此方法运行的总时间,包括了调用者的执行时间(即调用此方法整个的生命周期时长)。

自执行时间
仅表示执行当前方法把花费的时长。
方法
调用的方法名称。
源码
方法所在的文件路径。

Screenshot of a call tree table

自下而上

自下而上 视图也是用于显示方法调用堆栈,但顾名思义,它是一个自下而上的表示方式。这意味着表格中的每个最上方的方法实际上是给定 CPU 样本的调用堆栈中的最后一个方法 (换句话说,这是样本的叶节点)。

在这张表中,可以展开一个方法查看它的所有 调用者

总时间

此方法运行的总时间,包括了调用者的执行时间(即调用此方法整个的生命周期时长)。

自执行时间

在自下而上调用树中对于最顶层的方法(叶堆栈帧),它表示执行自己的代码所需要的时间。对于子节点(调用者),它表示调用者运行被调用者的时间。在下面的这个例子中,调用者 `createRenderObject` 的执行时间等于被调用者 `debugCheckHasDirectionality` 的执行时间。

方法
调用方法的名称。
源码
方法所在的文件路径。

Screenshot of a bottom up table

Other resources

To learn how to use DevTools to analyze the CPU usage of a compute-intensive Mandelbrot app, check out a guided CPU Profiler View tutorial. Also, learn how to analyze CPU usage when the app uses isolates for parallel computing.