DevTool Performance 性能分析到底怎么看? 全网最细!

449 阅读14分钟

查看主线程活动

使用 Main 轨道可查看在页面的主线程上发生的活动。

image.png
点击某个事件可在摘要标签页中查看关于该事件的更多信息。效果面板会以蓝色显示所选事件的轮廓。

image.png

此示例显示了有关摘要标签页中 get 函数调用事件的更多信息。

阅读火焰图

Performance 面板以火焰图表示主线程活动。X 轴表示一段时间内的记录。y 轴表示调用堆栈。上面的事件会导致以下事件。

image.png

此示例展示了 Main 轨道中的火焰图。click 事件导致匿名函数调用。进而调用 onEndpointClick_,后者调用 handleClick_,依此类推。

Performance 面板会为脚本分配随机颜色,以细分火焰图并提高可读性。在前面的示例中,来自一个脚本的函数调用显示为浅蓝色。来自其他脚本的呼叫会显示为浅粉色。深黄色表示脚本活动,紫色事件表示渲染活动。这些较深的黄色和紫色事件在所有录制内容中保持一致。

较长的任务也会用红色三角形突出显示,超过 50 毫秒的部分用红色阴影表示:

image.png

在此示例中,任务耗时超过 400 毫秒,因此代表最后 350 毫秒的部分用红色阴影表示,而最初的 50 毫秒则不是。

此外,Main 轨道还会显示使用 profile()profileEnd() 控制台函数启动和停止的 CPU 配置文件的相关信息。

如需隐藏 JavaScript 调用的详细火焰图,请参阅停用 JavaScript 示例。停用 JS 示例后,您只会看到高级事件,例如 Event (click)Function Call

跟踪事件发起者

Main 轨道可以显示将以下发起者及其引发的事件连接的箭头:

  • 样式或布局失效 ->重新计算样式布局
  • 请求动画帧 ->动画帧已触发
  • 请求空闲回调 ->触发空闲回调
  • 安装计时器 ->计时器已触发
  • 创建 WebSocket ->Send...Receive WebSocket HandshakeDestroy WebSocket

如需查看箭头,请在火焰图中找到发起者或它引发的事件,并将其选中。

image.png

选择此选项后,“Summary”(摘要)标签页会显示发起者的发起者链接,以及对于它们所导致的事件的发起者链接。点击这些事件可在相应事件之间切换。

image.png

在火焰图中隐藏函数及其子函数

如需整理 Main 线程中的火焰图,您可以隐藏所选函数或其子函数:

  1. Main 轨道中,右键点击某个函数,然后选择以下选项之一或按相应的快捷键:

    • 隐藏函数 (H)
    • 隐藏子项 (C)
    • 隐藏重复的子项 (R)
    • 重置子项 (U)
    • 重置跟踪记录 (T)
    • 将脚本添加到忽略列表 (I)

image.png

arrow\_drop\_down 下拉按钮会显示在包含隐藏子级的函数名称旁边。

2. 如需查看隐藏的子级的数量,请将鼠标悬停在 arrow_drop_down 下拉按钮上。

image.png

  1. 如需重置包含隐藏子级或整个火焰图的函数,请选择该函数并按 U,或者右键点击任意函数,然后分别选择 Reset trace

忽略火焰图中的脚本

要向忽略列表添加脚本,请右键点击图表中的脚本,然后选择向忽略列表添加脚本

image.png

图表会收起被忽略的脚本,将它们标记为在忽略列表中,然后将它们添加到设置中的自定义排除规则中,依次点击设置 >忽略列表。系统会保存已忽略的脚本,直到您将其从跟踪记录或自定义排除规则中移除为止。

image.png

在表格中查看活动

记录网页后,您无需仅依赖 Main 轨道来分析活动, 开发者工具还提供三种表格视图,用于分析活动。每种视图都提供了 关于这些活动的观点:

为帮助您更快地找到所需内容,所有三个标签的过滤器栏旁都提供了高级过滤按钮:

  • match_case 匹配大小写

  • regular_expression 正则表达式

  • match_word 匹配整个字词

image.png

效果面板中的每个表格视图都会显示函数调用等活动的链接。 为了帮助您进行调试,开发者工具会在源文件中查找相应的函数声明。 此外,如果存在并启用了相应的源映射,则开发者工具会自动查找原始文件。

点击链接即可在 Sources 面板中打开源文件。

image.png

注意:接下来的三个部分都指的是同一个演示。您可以访问以下网址自行运行演示: 活动标签页演示,并在以下位置查看源代码: GoogleChrome/devtools-samples/perf/activitytabs.html.

根 activity

以下是对 Call Tree 标签页中提到的“根 activity”概念的说明。 Bottom-Up 标签页和事件日志部分。

根 activity 是导致浏览器执行某些工作的 activity。例如,当您点击 页面时,浏览器会触发 Event activity 作为根 activity。然后,该 Event 可能会导致处理程序 调用。

轨道的火焰图中,根 activity 位于图表的顶部。在通话中 TreeEvent Log 标签页中,根 activity 是顶层项。

如需查看根 activity 的示例,请参阅“调用树”标签页

“Call Tree”标签页

使用 Call Tree 标签页查看哪些根 activity 导致的工作量最多。

Call Tree 标签页仅显示所选部分录制的活动。请参阅 选择记录的一部分,了解如何选择部分。

image.png

在此示例中,活动列中的顶级项目(例如 EventPaintComposite Layers 是根 activity。嵌套表示调用堆栈。在 在此示例中,Event 导致了 Function Call,进而导致 button.addEventListener,进而导致 b, 依此类推。

自用时间表示直接花在该活动上的时间。总时间表示 用户在该活动或其任何子项上所花的时间。

点击自用时间总时间活动,按对应的列对表格进行排序。

使用过滤框可按活动名称过滤事件。

默认情况下,分组菜单设置为不分组。使用分组菜单可对 查看相应的活动表格

点击显示最耗时的堆栈Activity 表格的右侧显示另一个表格。点击一个活动以填充 最长堆栈表。Heaviest Stack 表格显示所选节点的哪些子级 一个活动的执行时间最长。

image.png

“Bottom-Up”标签页

使用自下而上标签页可查看直接占用的汇总时间最多的活动。

Bottom-Up 标签页仅显示所选部分的活动。请参阅 选择记录的一部分,了解如何选择部分。

image.png

在该示例的轨道火焰图中,您可以看到几乎所有 执行对 wait() 的三次调用所用的时间。相应地, Bottom-Up 标签页为 wait。在火焰图中, 对 wait 的调用实际上是数千个 Minor GC 调用。因此,您可以看到 Bottom-Up 标签页中,下一个开销最大的 activity 是 Minor GC

自用时间列表示所有 其出现次数。

总时间列表示该活动或其任何子活动花费的汇总时间。

“事件日志”标签

使用事件日志标签可按活动期间的发生顺序查看活动 录制。

事件日志标签页仅显示所选部分记录的活动。请参阅 选择记录的一部分,了解如何选择部分。

image.png

开始时间列表示相对于开始时间,该活动开始的时间点 在此示例中,所选项目的 1573.0 ms 开始时间 表示活动在记录开始 1573 毫秒后开始。

自用时间列表示您直接花在该活动上的时间。

总时间列表示您直接花在该活动上或任意活动上的时间 子女。

点击开始时间自用时间总时间,即可按该列对表格进行排序。

使用过滤条件框可按名称过滤活动。

使用时长菜单可过滤掉不到 1 毫秒或 15 毫秒的所有活动。默认情况下 将时长菜单设为全部,这意味着系统会显示所有活动。

取消选中加载脚本呈现绘制复选框,以过滤出 这些类别的活动

查看显示时间

计时轨道上,查看重要标记,例如:

image.png

选择一个标记即可在摘要标签页中查看更多详情,包括其时间戳、总时间、自用时间和 detail 对象

查看互动次数

互动轨道上查看用户互动情况,追踪潜在的响应问题。

若要查看互动情况,请执行以下操作:

  1. 例如,在此演示页面打开开发者工具

  2. 打开性能面板,然后开始记录

  3. 点击某个元素(咖啡)并停止记录。

  4. 在时间轴中找到互动轨道。

image.png

在此示例中,Interactions 轨迹显示了 Pointer 互动。互动具有胡须,表示处理时间范围内的输入和呈现延迟。将鼠标悬停在互动上,即可看到包含输入延迟、处理时间和呈现延迟的提示。

对于时长超过 200 毫秒的互动,Interactions 轨道还会在 Summary 标签页中以及悬停时的提示中显示 Interaction to Next Paint (INP) 警告:

image.png

互动轨道会标记时长超过 200 毫秒的互动,并在右上角显示一个红色三角形。

查看 GPU 活动

GPU 部分中查看 GPU 活动。

image.png

查看光栅活动

线程池部分中查看光栅活动。

image.png

分析每秒帧数 (FPS)

开发者工具提供了多种每秒分析帧的方法:

“框架”部分

(Frames) 部分会显示特定帧的确切用时。

将鼠标悬停在帧上可查看包含相关详细信息的提示。

image.png

此示例显示了将鼠标悬停在帧上时显示的提示。

部分可显示四种类型的帧:

  1. 空闲帧(白色)。无任何更改。
  2. 框架(绿色)。按预期及时呈现。
  3. 部分呈现的帧(黄色,具有稀疏宽短划线图案)。Chrome 已尽力及时呈现至少一些视觉更新。例如,如果渲染器进程的主线程工作(画布动画)延迟,但合成器线程(滚动)及时。
  4. 丢帧(红色,带有密集实线图案)。Chrome 无法在合理时间内呈现帧。

image.png

此示例会在您将鼠标悬停在部分呈现的帧上时显示提示。

点击某个帧可在摘要标签页中查看更多有关该帧的信息。DevTools 用蓝色勾勒出所选框

image.png

查看网络请求

展开网络部分,查看在性能记录期间发生的网络请求瀑布流。

image.png

广告网络轨道名称旁边有一个采用不同颜色的请求类型的图例。

阻塞渲染的请求在右上角标有红色三角形。

将鼠标悬停在请求上可查看包含以下信息的提示:

  • 请求的网址以及执行请求所需的总时间。
  • 优先级或优先级更改,例如 Medium -> High
  • 请求是否为 Render blocking
  • 请求时间的明细,将在后面介绍。

当您点击某个请求时,网络轨道会绘制一个从其发起方指向该请求的箭头。

此外,Performance 面板还会显示 Summary 标签,其中包含有关请求的详细信息,包括但不限于 Initial Priority(初始优先级)和(最终)Priority(优先级)字段。如果它们的值不同,则表示请求的提取优先级在记录期间发生了变化。如需了解详情,请参阅使用 Fetch Priority API 优化资源加载

摘要标签页还会显示详细的请求时间。

image.png

www.google.com 的请求由左侧的线条 (|–) 表示,中间的条形包含深色部分和浅色部分,以及右侧的线条 (–|)。

您可以在网络标签页中找到其他时间细分。右键点击广告网络轨道中的相应请求,或在摘要标签页中右键点击该请求,然后点击在“网络”面板中显示。开发者工具会将您转到 Network 面板并选择相应的请求。打开其计时标签页。

image.png

这两种细分的对应关系如下:

  • 左侧行 (|–) 包含事件组 Connection start(含)之前的所有内容。也就是说,它是 Request Sent 之前的所有内容。
  • 该条形的浅色部分为 Request sentWaiting for server response
  • 条形的深色部分为 Content download
  • 右侧代码行 (–|) 是等待主线程所花的时间。网络 >计时标签页未对此进行显示。

查看内存指标

选中内存复选框可查看上次记录的内存指标。

image.png 开发者工具会在 Summary 标签页上方显示一个新的 Memory 图表。下面还有一个新图表 名为 HEAPNET 图表。HEAP 图表提供的信息与 JS 内存图表中的堆线条。

image.png

此示例显示 Summary 标签页上方的内存指标。

图表上的彩色线条对应于图表上方的彩色复选框。通过停用复选框 在图表中隐藏该类别。

图表仅显示所选记录的区域。在前面的示例中,Memory 图表仅显示开始录制(一直到 1000 毫秒左右)的内存用量。

查看部分记录的时长

在分析“网络”或“主要”等版块时,有时您需要更精确地估算 特定事件所花费的时间按住 Shift 键,点击并按住,然后向左或向右拖动以选择部分 在所选内容的底部,DevTools 会显示该部分所用的时间。

image.png

在此示例中,所选部分底部的 488.53ms 时间戳指示时长 该部分所占的比例

查看屏幕截图

如需了解如何启用屏幕截图功能,请参阅在录制时截取屏幕截图

将鼠标悬停在时间轴概览上,就能查看网页在该时刻对应的屏幕截图 录制。时间轴概览部分包含 CPUFPSNET 图表。

image.png

您也可以点击 Frames 部分中的相应帧来查看屏幕截图。开发者工具会显示 摘要标签页中的屏幕截图。

image.png

此示例显示了您在部分中点击摘要标签页中的 195.5ms 帧的屏幕截图。

点击摘要标签页中的缩略图可放大屏幕截图。

image.png

此示例显示了您在摘要标签中点击缩略图的缩略图被放大的屏幕截图。

查看图层信息

要查看帧的高级图层信息,请执行以下操作:

  1. 启用高级绘制插桩

  2. Frames 部分选择一个帧。开发者工具会在 新的图层标签页(在事件日志标签页旁边)。

image.png

将鼠标悬停在图层上可在图表中突出显示。

image.png

此示例显示了当您将鼠标悬停在图层 #39 上时,图层处于突出显示状态。