分析运行时性能 (教程)

运行时性能 是页面在运行时(而不是加载)时的表现。 以下教程介绍如何使用 DevTools 性能 工具分析运行时性能。

本教程中学到的技能可用于分析 Web 内容的加载、交互性和视觉稳定性,这也是 Core Web Vitals 的关键指标。 每个核心 Web Vitals 都代表用户体验的一个不同方面,在现场可衡量,并反映了以用户为中心的关键结果的实际体验。 可以在 性能 工具中查看这些核心 Web 重要数据。

另请参阅:

入门

在以下教程中,你将在“缓慢动画”演示页上打开 DevTools,并使用 性能 工具在页面上查找性能瓶颈。

  1. 右键单击链接“ 慢动作” ,然后选择“ 在 InPrivate 窗口中打开链接”。 你将分析此页面,其中显示了上移和下移的图标数量不定。 另请参阅 在 Microsoft Edge 中浏览 InPrivate

    如果要查看演示的源代码,请参阅 MicrosoftEdge/Demos > devtools-performance-get-started

  2. 右键单击演示网页,然后选择“ 检查”。

    DevTools 将打开:

    左侧为演示,右侧为 DevTools

性能工具的大多数屏幕截图显示 DevTools 已取消停靠到单独的窗口

模拟移动 CPU

与台式机和笔记本电脑相比,移动设备的 CPU 功率更小。 每当你分析页面时,都可使用 CPU 节流来模拟页面在移动设备上的表现。

  1. 在 DevTools 中,打开 “性能 ”工具。

  2. 单击“ 捕获设置” (“ 捕获设置 ”) 。 DevTools 显示了有关如何捕获效果指标的设置。

  3. 对于 "CPU",选择 4x 减速。 DevTools 会限制 CPU,使其比平时慢 4 倍。

    CPU 限制

    “性能”工具的选项卡上会显示一个警告图标,提醒你已启用限制。

如果要确保页面在低端移动设备上正常工作,请将 CPU 设置为 6 倍减速

设置演示

在下一部分中,请继续上述作,自定义演示,以确保你的体验与屏幕截图和说明相对一致。

  1. 单击“ 添加元素 ”按钮,直到蓝色图标的移动速度明显比之前慢。 在高端计算机上,可以单击大约 20 次。

  2. 单击“ 优化”。 蓝色图标移动速度更快、更平稳。

  3. 若要更好地显示优化版本与未优化版本之间的差异,请单击“ 删除元素 ”按钮几次,然后重试。 如果添加过多的蓝色图标,可能会使 CPU 最大化,并且两个版本的结果可能不会有重大差异。

  4. 单击“慢”。 蓝色图标移动速度变慢,而且又更加迟钝。

记录运行时性能

运行优化版本的页面时,蓝色图标会移动得更快。 为什么? 两种版本都应该在相同的时间内将图标移动相同的空间。 在 性能 工具中录制内容,了解如何检测未优化版本中的性能瓶颈。

继续上述作:

  1. 在 DevTools 中,单击“ 记录 (记录) ”。 页面运行时,DevTools 将捕获效果指标。

    配置文件页面

  2. 稍等几秒钟。

  3. 单击停止。 DevTools 停止录制,处理数据,然后在 性能 工具中显示结果。

    配置文件的结果

这些性能结果显示大量的数据,但很快会更有意义。

分析结果

记录页面性能后,可以评估页面的性能并找到任何性能问题的原因。

继续上述作:

  1. CPU 图表沿顶部显示。 CPU 图表中的颜色对应于性能工具底部的“摘要”面板中的颜色。 CPU 图表显示,这些区域构成了一个大区域,这意味着 CPU 在录制期间已达到最大。 每当 CPU 长时间耗尽时,这表示页面性能不佳。

    CPU 图表和“摘要”面板

  2. 将鼠标悬停在 CPUNET 图表上。 DevTools 将显示该时间点处的页面截图。 左右移动鼠标以重播录音。 该作称为 “清理”,它可用于手动分析性能录制进度。

    鼠标悬停在框架上

奖励:打开帧呈现统计信息覆盖层

另一个方便的工具是 帧呈现统计信息 覆盖,它提供页面运行时 FPS 的实时估计值。 本教程不需要 帧呈现统计信息 覆盖,但可提供有用的见解。

继续上述作:

  1. 在 DevTools 中,按 Ctrl+Shift+P (Windows、Linux) 或 Command+Shift+P (macOS) 打开 命令菜单

  2. 开始在命令菜单中键入Rendering,然后单击“显示呈现”。

  3. “呈现 ”工具中,打开 “帧呈现统计信息”。新的覆盖层显示在网页的左上角。

    FPS 覆盖

  4. 查看完 FPS 数据后,请清除 “帧呈现统计信息 ”复选框以隐藏覆盖层。

查找瓶颈

验证动画性能不佳后,下一步是回答问题“为什么?”

继续上述作:

  1. 如果未选择任何事件,“ 摘要 ”面板会显示活动的细目。 页面大部分时间都在渲染。 由于性能是减少工作量的艺术,因此你的目标是减少花费在进行绘制工作上的时间。

    “摘要”面板

  2. 展开重点部分。 DevTools 将显示一段时间内主线程上活动的帧图表。 x 轴表示一段时间内的记录。 每个条形表示一个事件。 宽条表示该事件花费了更长的时间。 Y 轴表示调用堆叠。 当事件堆叠在一起时,这意味着上面的事件导致了下面的事件。

    主要部分

  3. 记录中有很多数据。 若要放大录制的一部分,请在 “概述 ”区域中单击并拖动到 “性能 ”工具的顶部。 “ 概述 ”区域包括 (右侧) 指示的 CPUNET 图表。 “ 主要 ”部分和 “摘要” 面板仅显示录制的选定部分的信息。

    放大部分

    更改所选区域的另一种方法是将焦点放在 “主 ”部分,单击背景或事件,然后按:

    • W 放大缩小 S 字体功能 放大缩小字体功能
    • A 将所选内容向左移动, D 将所选内容向右移动。
  4. 单击 动画帧触发 事件。

    当事件右上角显示红色三角形时,会发出警告,指出可能存在与事件相关的问题。 每当运行 requestAnimationFrame() 时,将发生 动画帧触发事件。

    摘要” 面板显示有关该事件的信息:

    有关动画帧触发事件的详细信息

  5. 单击“ 显示” 链接。 DevTools 突出显示启动 动画帧触发 事件的事件。

  6. 单击 “app.js:125 ”链接。 源代码的相关行显示在 “源 ”工具中。

  7. 使用鼠标滚轮或触控板放大 动画帧触发 事件及其子事件。 或者,按 W

    现在可以看到呈现动画的单个帧时发生的事件。 更新函数被调用,后者又调用 updateSlow 函数,该函数会触发许多“重新计算样式”和“布局”事件:

    动画帧触发事件及其子事件

  8. 单击其中一个紫色 布局 事件。 DevTools 在摘要面板中提供了有关事件详细信息。 ) 重新布局 (出现有关“强制重排”的警告。

  9. “摘要”面板中,单击“布局强制”下的“app.js:104”链接。 DevTools 将你带到在 工具中强制布局的代码行:

    导致强制布局的代码行

    未优化代码的问题在于,在每个动画帧中,它会更改每个图标的样式,然后查询页面上每个图标的位置。 由于样式已更改,浏览器不知道每个图标位置是否已更改,因此必须重新布局图标才能计算新位置。

分析优化版本

使用刚刚了解的工作流和工具,单击演示网页上的“ 优化 ”以打开优化的代码,进行另一次性能记录,然后分析结果。 从改进的帧速率到“”节中绘制图表事件的减少,应用的优化版本执行的工作要少得多,从而产生更好的性能。

未优化的版本

将此 JavaScript 代码片段与未优化的应用版本进行比较:

// Read the current position.
const currentPos = element.offsetTop;
// Read the direction.
const direction = element.dataset.dir;
// Calculate the next position.
let nextPos = direction === 'up' ? currentPos - SPEED : currentPos + SPEED;

// If the new position is out of bounds, reset it.
if (nextPos < 0) {
  nextPos = 0;
} else if (nextPos > canvas.offsetHeight) {
  nextPos = canvas.offsetHeight;
}

// Set the new position on the element.
element.style.top = `${nextPos}px`;

// Switch the direction if needed.
if (element.offsetTop === 0) {
  element.dataset.dir = 'down';
} else if (element.offsetTop === canvas.offsetHeight) {
  element.dataset.dir = 'up';
}

上述代码片段在浏览器呈现循环的每个帧上运行,对于页面上的每个蓝色图标。 变量 element 引用单个蓝色图标。

在此未优化版本中,我们将创建一个 nextPos 变量,该变量设置为图标的当前位置,我们将向该图标添加一些距离。 使用 element.offsetTop读取图标的当前位置。

在确保图标仍位于页面的边界内后,我们使用 设置其新位置 element.style.top,该位置在 元素上设置内联样式。

最后,我们再次阅读 element.offsetTop 调整图标的方向。

优化版本

优化后的代码使用不同的作序列来减少工作。 下面是应用优化版本中的相同 JavaScript 代码片段:

// Read the current position.
const currentPos = parseFloat(element.style.transform.match(/[0-9.]+/)[0]);
// Read the direction.
const direction = element.dataset.dir;
// Calculate the next position.
let nextPos = direction === 'up' ? currentPos - (SPEED * 100 / canvasHeight) : currentPos + (SPEED * 100 / canvasHeight);

// If the new position is out of bounds, reset it, and switch the direction.
if (nextPos < 0) {
  nextPos = 0;
  element.dataset.dir = 'down';
} else if (nextPos > 100) {
  nextPos = 100;
  element.dataset.dir = 'up';
}

// Set the new position on the element.
element.style.transform = `translateY(${nextPos}vh)`;

在优化版本中,我们首先通过读取element.style.transform而不是使用 element.offsetTop来设置变量的值nextPos。 使用元素的内联样式会更快,因为读取 element.offsetTop 会强制浏览器引擎知道页面上所有元素的位置,这需要引擎重新计算样式和布局。

然后,我们调整图标的方向,但这次我们不会像在未优化版本中那样再次阅读 element.offsetTop

最后,我们设置图标的新位置,但这次我们使用 element.style.transform 而不是 element.style.top。 使用 element.style.transform 速度更快,因为浏览器呈现引擎可以应用 CSS transform 属性,而无需重新计算页面布局。 使用 transform 属性时,浏览器会将每个图标视为单个层,然后通过重新组合最终图像,将这些层显示在正确位置。

若要了解详细信息,请参阅 对动画使用转换和不透明度更改

后续步骤

若要更熟悉 性能 工具,请练习分析页面和分析结果。

如果对结果有任何疑问,请在活动栏中选择“帮助” (“活动栏”) >“反馈”中的“帮助”图标。 或者,按 Alt+Shift+I (Windows、Linux) 或 Option+Shift+I (macOS) 。

或者, 在 MicrosoftEdge/DevTools 存储库上提交问题

在反馈中,尽可能包含可重现页面的屏幕截图或链接。

可通过多种方式提高运行时性能。 本文重点介绍一个特定的动画瓶颈,重点介绍 性能 工具,但它只是你可能遇到的许多瓶颈之一。

注意

此页面的某些部分是根据 Google 创建和共享的作品所做的修改,并根据 Creative Commons Attribution 4.0 International License 中描述的条款使用。 原始页面 在此处 找到,由凯斯·巴斯克创作。

Creative Commons 许可证 此作品根据 Creative Commons 署名 4.0 国际许可获得许可