当我们谈论前端性能时,我们在谈论什么

news2024/11/14 13:35:45

前端岗位内推来了

本文结合Google官方工具 Lighthouse 分析最新的前端页面性能评分标准,帮助大家更好地理解各种性能指标,以改进和优化相关前端项目。

前端页面性能一直是大家持续关注的话题,因为用户留存率与页面加载性能密切相关。根据Google的数据统计,当页面访问时长从1秒增加到3秒时,用户跳出率会增加32%。

评估前端页面性能通常有两种形式:一是使用性能分析工具在线对各项指标进行评分和评估;二是使用性能监控,通过 Performance API 或自定义跟踪点报告用户的真实网络访问情况,然后进行统计分析。

虽然统计收集用户数据更贴近实际,但为了对页面性能评估有一个统一的量化标准,我们通常选择使用标准评分工具来评估页面性能。

在性能分析的早期阶段,我们会使用Chrome开发者工具分析网页,包括查看 loadDOMContentLoaded等事件触发的时间。后来出现了一系列性能分析工具,如Webpage Analyzer、WebPageTest、YSlow等。

现在Google已经正式将其自主开发的Lighthouse嵌入到开发者工具标签中,我们将Lighthouse视为标准评估工具。

Lighthouse 是一个开源的网页性能分析工具,提供了关于页面最佳实践的相关建议。除了可以直接在Chrome DevTools中使用外,它还支持浏览器扩展(Chrome和Firefox)或npm包(Node API或CLI)。

像 Google 的 Web measure 和 PageSpeed Insight等工具都使用Lighthouse来分析页面。

1.Lighthouse 的迭代和性能指标变化

Lighthouse 的第一个开源版本可以追溯到2016年,截至2020年10月,最新版本是6.4.1,总共经历了89次迭代。多年来,Lighthouse一直在更新其性能指标的选择。

在最新的6.x版本中,与5.x版本相比,Google引入了三个新的性能指标:移除了FMP(First Meaningful Paint)、FCI(First CPU Idle)和 mpFID(Max Potential First Input Delay);

添加了TBT(Total Blocking Time)、LCP(Largest Contentful Paint)和CLS(Cumulative Layout Shift)。以下部分将对这些指标进行详细解释。

c9891a76bcb326614060666de3d448df.png

2.如何计算页面性能得分

如下图所示,在页面性能部分,Lighthouse将评估6个关键指标的性能,并计算页面的性能得分。

e9927f6c1caec3439939c817c6302521.png

根据最新的6.x计算方法,每个性能指标对应一个分数。例如,在上图中,FCP、SI、LCP、TTI、TBT和CLS的值分别对应78、62、37、5、99和92的单项得分。通常来说,指标值越小,其对应的得分越高。

这六个指标分别被赋予15%、15%、25%、15%、25%和5%的权重。总体性能得分的计算如图所示 — 通过加权平均得到总分60分。

每个指标值如何对应其各自的得分计算方法的具体细节可以在文章末尾的参考文献5和6中找到。

在Lighthouse v6.0版本中, 移除了三个关键性能指标: FMP(First Meaningful Paint)、FCI(First CPU Idle) 和 mpFID(Maximum Potential First Input Delay)。

我们将首先examine这三个已弃用指标的定义,以better理解当前版本如何选择其指标。

1. 什么是FMP,它与FCP有什么区别?

谈到FMP,我们必须首先介绍First Contentful Paint (FCP):第一次内容渲染的时间。

顾名思义,只要浏览器第一次触发The First Page Paint事件,这一刻就是FCP。然而,此时渲染的内容不一定是重要的页面信息,比如只绘制了一个头部操作栏或甚至可见元素。虽然它在Lighthouse 6.0中被保留,但其在性能得分中的权重从23%降至15%。

因此,从用户的角度来看,FCP不能作为页面性能的准确指标。

在这种背景下,FMP(First Meaningful Paint)应运而生。根据官方定义,FMP指的是自页面加载开始以来,初始屏幕上大部分或主要内容已被渲染的时间点。

那么FMP的计时如何确认?让我们先看最基本的计算方法:

我们首先计算布局对象的数量(使用LayoutAnalyzer进行测试计算;参见参考文献17)。

如下图所示,可以看到页面加载过程是布局对象逐步进入布局树并渲染的过程。

11e326c0488954ecae68127e6749a6d8.png

layoutAnalyzer 收集布局对象的数量,有一个计数器叫 LayoutObjectsThatHadNeverHadLayout,代表新增加的布局对象的数量。

通过测试发现,与其他计数器相比,它变化最大的时刻往往是页面上最重要的元素被渲染的时候。

因此,FMP指标的计算方法是LayoutObjectsThatHadNeverHadLayout(新增布局对象)经历最大变化后的下一刻(跟随最大布局变化的绘制)。

当然,也有一些情况下上述情况不适用:

a) 如果页面很长,可能在第一屏内添加的不可见布局对象比可见的多。在这种情况下,FMP变得不准确。

b) 在加载网络字体的情况下,文本使用fallback字体进行布局但默认在loadstart后3秒内不绘制;这也会影响FMP的计算。

对于场景1,FMP引入了"布局重要性"的概念来解决这个问题;对于场景2,FMP延迟统计以使指标更准确地反映页面状况。更详细的解决方案请参考参考文献18。

然而,FMP最终在6.0版本中被弃用,主要是由于以下两个原因:

  • 在生产环境中,FMP对页面上的微小变化过于敏感,容易导致结果不一致。

  • 这个指标的定义过于依赖浏览器的具体实现细节,缺乏标准化的参考。

2.LCP的到来取代了FMP

前一节提到了FCP和FMP的缺点,所以W3C的性能组一直在思考找到一个合适的指标,更准确地反映用户看到页面主要内容的时间。

有时候更简单更好。基于各方面关于页面性能的讨论,终于找到了一个更准确的方法来衡量页面的主要内容是否已加载,这就是 LCP(Largest Contentful Paint)

LCP指的是视口内最大内容元素渲染的时间。这个指标在Lighthouse 6.0中正式引入,在最终性能得分中占据高达25%的权重。

LCP 应该是除FCP之外最容易定义的指标之一。从其定义来看,有两个关键点:选择哪些元素进行比较,以及如何确定它们的大小。

根据官方文档,以下元素将被视为 Largest Contentful Element 的一部分:

  • <img>

  • <svg>中的<image>

  • <video>

  • 通过url()函数加载背景图片的元素

  • 包含文本节点或内联文本子元素的块级元素

我们如何确定一个元素的大小?主要基于这四条规则:

  • 视口内可见元素的大小;如果它们超出或被裁剪或被遮挡,则不计入元素大小。

  • 对于图像元素,大小由Min(实际大小,原始大小)决定。

  • 对于文本元素,只考虑覆盖所有文本的最小矩形区域。

  • 对于所有元素,不包括margin、padding、border等在计算中。

Google对这个指标的评价如下:LCP是一个非常重要的以用户为中心的指标;它反映了用户层面感知的加载速度;它标志着主要内容中最大内容元素的加载完成;LCP时间越短,用户感知页面可用的速度越快。

3.被放弃的FCI是什么,为什么它与TTI如此密切相关?

FCI(First CPU Idle:首次CPU空闲),这个指标用来衡量一个页面达到最小可交互标准需要多长时间。

最小可交互性的确认需要同时满足以下两个条件:

a) 屏幕上的大多数UI元素是可交互的

b) 页面对用户输入的响应平均在合理范围内

TTI(Time To Interactive:页面可交互时间),指页面达到完全可交互状态所需的时间。

完全可交互意味着同时满足以下三个条件:

a) FCP之后,页面上已经渲染了有用的内容

b) 为最可见的页面元素注册了事件回调

c) 页面对用户交互的响应在50ms以内

2017年,First Interactive 指标被分为两个指标: First Interactive 和 Consistently Interactive; 次年7月, First Interactive被重命名为 FCI,而Consistently Interactive 被重命名为TTI。可以看出,FCI和TTI是两个反映用户交互响应的指标。

那么,最小可交互性和完全可交互性是如何计算的?在介绍具体计算方法之前,我们需要知道,这两个指标都是模糊的,可以在不同情况下不断优化和改进。

FCI的最小可交互时间

在主线程的时间线上,从FMP开始直到某个任务结束之后,找到一个长度为f(t)的时间窗口W。如果W满足在其持续时间内任何时刻都没有连续超过250ms的任务集,并且在其结束前后1秒内没有长任务(JS执行时间超过50ms的任务)。那个任务结束的时刻就是我们定义的FCI。其中f(t)=4e^(-0.045t)+1

下图中红框指示的时间点就是FCI。

470747a2d1e8a4e5df3e2c26f6f6e83e.png

TTI完全可交互时间

从网络和主线程的时间线上,找到第一个5s窗口期 W。在 W 期间,应满足以下条件:任何时刻并发网络请求不超过两个,且没有超过50ms的长任务。W 之前最后一个长任务结束的时间就是我们所说的TTI。

下图中红框指示的时间点就是TTI:

22dfa7183d657b93a8278070b023822e.png

尽管有人指出FCI在某些时候比TTI更有意义,但它们之间的区别仍然不足以证明 Lighthouse 保留两个相似的指标。

因此,在Lighthouse 6.0中,最终决定使用TTI代替FCI。

4.mpFID和新增的TBT指标

mpFID(max potential First Input Delay)指的是页面上从用户输入到实际开始处理事件回调的潜在最大延迟时间。

mpFID的具体计算方法是选择从FCP到TTI之间JavaScript执行时间最长的任务,然后从该任务消耗的时间中减去50ms。

然而,mpFID只代表一个最大延迟时间,可能与用户实际体验到的延迟时间不同。用户在不同时间获得的FID也会有所不同。因此,mpFID并不能真实反映页面对用户输入的响应时间。

在5.x版本计算性能得分时,mpFID权重为0,不参与打分。虽然这个指标不再出现在报告中,但它仍然保留在JSON数据中,仍然是官方认可的关键用户体验指标。

那么,TBT(Total Blocking Time)到底是什么,为什么在性能报告中选择它而不是FID呢?

我们先来看看它的定义:TBT指的是页面在响应用户输入时被阻塞的总累计时间。

具体计算方法相当清晰 — 将FCP和TTI之间的所有长任务加起来,并将它们的阻塞部分的时间相加,就得到了TBT。阻塞部分的时间指的是长任务执行超过50ms的任何部分;例如,如果一个长任务总共花费70ms,那么阻塞时间就是20ms。

可以看出,与mpFID相比,TBT是一个更稳定的指标,能更准确地反映页面对用户输入的平均延迟响应。

5. 新增的CLS

CLS(Cumulative Layout Shift),是用来衡量视觉界面稳定性的指标。

数据来源于Layout Instability API(参见参考文献14),计算方法如下:

layout shift score = impact fraction * distance fraction

布局移动分数 = 影响分数 * 距离分数

其中impact fraction指的是对整个视口的影响程度。例如,在下图中,如果文本占整个视口的50%,在下一帧中相对于上一帧向下移动了25%,那么它影响了整个页面的75%。因此,impact fraction为0.75。

b515a0fddd6bb83ce6437faeb98d91e8.png

distance fraction相对容易理解,它指的是改变的距离占整个视口的比例。例如,在上述案例中,移动25%意味 着distance fraction 为 0.25。

因此,图示demo的CLS值计算为0.75 * 0.25 = 0.1875。更详细的计算方法可以参考参考文献13和14。

一个说明CLS如何影响用户体验的例子:如下图所示,当用户试图点击取消按钮时,突然页面发生布局偏移,确认按钮出现在之前取消按钮的位置...

2686bfdaf8555857330d291311d6286f.gif

可以看出,CLS是一个更加以用户为中心的新性能评估指标。

目前,CLS作为一个新增指标权重较小,只有5%,但Lighthouse已经在考虑在下一个主要版本中增加其权重。

6. 一直存在的Speed Index

Speed Index(SI)用于衡量可见内容填充页面的速度,计算过程使用开源工具Speedline(参考文献16)。

Speedline记录页面的视频,并通过测量第一帧和最后一帧之间的时间差来计算Speed Index的值。

值得一提的是,SI的最终得分将通过与数据库中真实网站的SI值进行比较来计算。目前,SI得分和评分标准如下表所示:

f23b311780712e53af217f009055014d.png

回顾上述指标替换的过程,我们可以看到,无论是从FMP到LCP,FCI到TTI,还是FID到TBT,目前在性能指标的选择上,都在向更稳定的方向发展:指标的定义越来越简洁明了,计算方法也趋向标准化。

然而,我们也应该知道,这里没有银弹;每个指标都会有其局限性。在许多场景下,低分并不一定意味着页面体验差。只有理解这些指标背后的原理,我们才能基于性能得分更科学地评估页面。

由于性能相关技术的快速迭代,如果本文有任何遗漏,欢迎交流和纠正。

最后:

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1957236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全球模块化机器人市场展望与未来增长机遇预测:未来六年CAGR为14.9%

在全球自动化和智能化水平提升的背景下&#xff0c;模块化机器人正成为市场的焦点。本文详细分析了全球模块化机器人市场的现状、增长趋势及未来前景&#xff0c;旨在为投资者和业内人士提供深入的市场洞察和指导。 市场概览 据恒州诚思团队研究分析显示&#xff0c;2023年&am…

zeal 开发者离线文档工具

zeal是一款程序开发者不可或缺的离线文档查看器 下载地址 官网地址&#xff1a; windows版csdn下载(开箱即用含)&#xff1a;https://download.csdn.net/download/xzzteach/89588765 已离线 Android.docset Apache_HTTP_Server.docset Bash.docset Bootstrap_4.docset Bootst…

QT6安装

我是直接使用 qt-online-installer-windows-x64-4.8.0.exe 安装包一键安装的 需要安装包的可以在此路径下载&#xff1a; qt-online-installer-windows-x64-4.8.0.exe&#xff0c;qt6一键安装包资源-CSDN文库

C#编写软件发布公告2——服务端

简单说明 框架&#xff1a;.NET 6.0 MVC 数据库&#xff1a;sqlLite3(当然这是为考虑本地数据简单&#xff0c;可以考虑使用大型数据库) 一、界面效果展示 1、启动主页面 2、记录摘要界面 3、对应版本详细 二、实现代码逻辑 1、启动主页面 //关联日志文件写 builder.Loggi…

音频处理过程

1、音频 &#xff08;1&#xff09;打开设备 &#xff08;2&#xff09;从音频设备中读取数据 &#xff08;3&#xff09;将音频设备中读取的数据写入文件夹中 &#xff08;4&#xff09; 通过界面控制开始录制和结束录制&#xff08;使用多线程和状态码控制&#xff09; &…

Spring监听器不同的注册方式下带来的监听范围的变化

事件监听注册的几种方式 ApplicationContext下面简称AC 1.构建SpringApplication时注册&#xff08;可以监听AC启动阶段事件&#xff09; // 方式一: //写法1 SpringApplication application new SpringApplicationBuilder().listeners(new ApplicationPidFileWriter()).bu…

网课录制新技能,声画同步,三款录屏软件助力教师高效授课

在数字化教育的浪潮中&#xff0c;教师和培训讲师们越来越依赖于录制网课来提升教学效果。无论是PPT课件的深入讲解&#xff0c;Word文档的详细演示&#xff0c;还是操作手册的直观展示&#xff0c;一款出色的录屏软件都能使这一过程更加生动和高效。今天&#xff0c;我将为大家…

【C++/STL】:哈希 -- 线性探测哈希桶

目录 &#x1f4a1;前言一&#xff0c;unordered系列容器二&#xff0c;哈希2.1 哈希的概念2.2 哈希函数2.3 哈希冲突 三&#xff0c;哈希冲突解决(重点)3.1 开放定址法3.2 哈希桶(重点) 四&#xff0c;线性探测的实现4.1 线性探测的基本框架4.2 插入操作4.3 查找操作4.4 删除操…

【C++】类和对象——Lesson1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C &#x1f680;本系列文章为个人学习笔记…

【Golang 面试 - 基础题】每日 5 题(十)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

关联映射和缓存机制学习笔记

学习视频&#xff1a;4001 关联映射概述_哔哩哔哩_bilibili~4007 案例&#xff1a;商品的类别_哔哩哔哩_bilibili 目录 1.关联映射概述 1.1关联映射关系 一对一关系 一对多关系 多对多关系 Java对象如何描述事物之间的关系 1.2一对一查询 元素 a.嵌套查询方式 b.嵌套结果方…

Spring Cache常用注解

依赖代码如下&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency> 常用注解详解 1. Cacheable 作用&#xff1a;主要用于配置方法&#xff0c;使其…

第九届全球渲染大赛来了!CG爱好者准备好了吗!

在CG界的日历上&#xff0c;二月和八月总是特别繁忙的月份。这两个月&#xff0c;全球CG艺术界最盛大的赛事——全球渲染大赛&#xff0c;都会开放报名&#xff0c;吸引着世界各地的CG艺术家和爱好者参与。备受期待的第九届全球渲染大赛&#xff0c;已经定于2024年8月3日在美国…

微信私域运营工具分享

解决微信多管理难的问题&#xff0c;多微信工作重复做&#xff0c;效率低的问题&#xff0c;防止飞单、删除客户&#xff0c;解决私域运营的难题

在双碳目标下,如何实现工厂的数字化改造升级

在"双碳"目标下&#xff0c;如何实现工厂的数字化改造升级 在“双碳”目标&#xff0c;即2030年前实现碳达峰、2060年前实现碳中和的宏伟蓝图下&#xff0c;企业作为经济社会活动的主体&#xff0c;其改造升级不仅是响应国家战略的必然要求&#xff0c;也是实现可持…

软件压力测试知识大揭秘,专业软件测评公司推荐

在信息技术迅猛发展的今天&#xff0c;软件已经成为各个行业运作的核心。有助于提升工作效率和管理水平的&#xff0c;软件的稳定性和性能也变得尤为重要。而软件压力测试&#xff0c;作为一种重要的测试手段&#xff0c;逐渐受到了更多企业的重视。 软件压力测试&#xff0c;…

【ROS 最简单教程 001/300】ROS 概念介绍

ROS&#xff1a;Robot Operating System 【适用于机器人的开源元操作系统】 ROS Plumbing Tools Capabilities Ecosystem 通讯 Plumbing ⭐ 实现ROS不同节点之间的交互工具 Tools ⭐ 工具软件包 (ROS中的开发和调试工具)&#xff0c;提供 仿真 功能&#xff1b;功能 Capabi…

图文好物和无人直播实操:定位/涨粉/养号/橱窗/作品/制作/剪辑/开播/等等

1.前言 各位小伙伴大家好&#xff0c;这里是天夏共创&#xff0c;免费分享副业/创业精品项目资源&#xff0c;打破互联网创业/副业信息壁垒&#xff0c;和您一起共享副业/创业项目资源&#xff0c;开启智能化创业/副业新时代&#xff01;致力于每天免费分享全网互联网精品VIP项…

React类组件生命周期与this关键字

类组件生命周期 参考链接 一图胜千言&#xff08;不常用的生命周期函数已隐藏&#xff09; 代码&#xff1a; //CC1.js import { Component } from "react";export default class CC1 extends Component {constructor(props) {super(props);console.log("con…

基于IDEA+Mysql+SpringBoot开发的社区养老服务管理系统

基于IDEAMysqlSpringBoot开发的社区养老服务管理系统 项目介绍&#x1f481;&#x1f3fb; node -version 14.21.3 在当前社会老龄化趋势日益加剧的背景下&#xff0c;构建一个高效、便捷的社区网养老服务管理系统显得尤为重要。本项目基于Spring Boot框架开发&#xff0c;旨…