技术分享|前端性能 关键性能指标以及测量工具介绍

58cad600acfae48ea86f8a32d936bd20.png

4ac8f1d51a790a2b5315fd00b201238b.png

源宝导读:对于一款商业软件产品而言,其性能表现往往会直接关系到它的生死存亡,这种说法一点也不夸张,数据显示,40%的人放弃了加载时间超过3秒的网站。但是一个网页的加载时间,响应时间的“快”“慢”衡量方式却因人而异,难以测量。现在我们来介绍一些,客观专业的,可以衡量的前端性能关键指标以及测量工具。

一、关键性能指标以及说明

首先是一组软件性能对用户影响的调研数据:

  •  40%的人放弃了加载时间超过3秒的网站

  •  47%的消费者希望在2秒或更短的时间内完成网页加载

  •  页面响应时间,每延迟1秒就可以使转化率降低7%

  •  当页面加载时间从1秒增加到3秒时,跳出的概率增加32%

再来一组软件性能对收益影响的调研数据:

  • Google搜索延迟400ms导致搜索量下降 0.59%

  • Bing 延迟 2s导致收入下降 4.3%

  • Yahoo 延迟 400ms导致流量下降 5-9%

这些直观的数字,深刻地反映了软件性能对一款产品能否成功应用的重要影响,所以我们一定要认真对待。

既然我们已经知道了性能的重要性,那如何进行科学的描述与表达呢?在日常的一些交流中,我们通常使用的是一些定性的、感性的表达,例如:

  • 首屏加载速度

  • 用户操作网页时的响应速度

  • 网页响应用户时的流畅速度

但是这些无法量化,因人而异,无法测量,现在我们来介绍一些,客观专业的,可以衡量的指标。

1、FCP(First Contentful Paint)

顾名思义,FCP是衡量某个页面,从开始加载到页面中第一个元素被渲染之间的时间(元素包含文本、图片、canvas等)。

这个指标常用来衡量白屏的时间,性能指标如下表所示:


fast

moderate

slow

FCP time(s)

0-2

2-4

>4

往往很多页面会在页面准备进行JS加载之前,加入Loading或者骨架图,给用户更好的体验。

但是其实这并非是用户真正想要看到的内容,如何衡量用户真正想看到内容呢,我们来看看第二个指标。

2、LCP(Largest Contentful Paint) (核心指标之一)

LCP是用来衡量标准视口内可见的最大内容元素的渲染时间(元素包括img、video、div及其他块级元素)。

这个指标常常用来衡量用户感知的加载时间,LCP的指标性能如下表所示:


fast

moderate

slow

LCP time(s)

0-2.5

2.5-4

>4

我们通过一张图来了解一下FCP和LCP的关系

8f87e242c06220e7452d6d8bf1610e31.png

在我们日常的项目中,FCP和LCP尝尝用来审视页面首屏加载速度。

但是页面不仅只是展现首屏, 我们还会进行操作和交互,接下来我们介绍几个指标 TTI,FID,TBT,来反应页面加载到操作时的流畅速度和响应速度。

3、TTI(Time to Interactive)

TTI是用来测量页面所有资源加载成功并能够可靠地快速响应用户输入的时间。

他的意义很好理解,但是他的测量方式就会比较麻烦,必须要满足以下几个条件:

  1. 从 FCP 指标后开始计算

  2. 持续 5 秒内无长任务(执行时间超过 50 ms)且无两个以上正在进行中的 GET 请求

  3. 往前回溯至 5 秒前的最后一个长任务结束的时间


4、FID(First Input Delay) (核心指标之一)

FID是测量从用户第一次与页面交互的时间到浏览器实际上能够响应这种交互的时间。交互包括用户点击一个链接或者一个按钮等。

这个指标比较好理解,用户交互事件触发到页面响应中间耗费了多长时间,这个指标也就是我们说的响应速度和流畅速度。


fast

moderate

slow

FID time(ms)

<100ms

100-300ms

>300ms

5、TBT(Total Blocking Time)

TBT其实也是字面意思,衡量从FCP到TTI之间主线程被阻塞时长的总和。

但是大家可能会有疑问,因为JS本身是单线程的,什么才是被阻塞呢?

其实在我们介绍TTI的时候已经介绍过,JS有一个长任务的概念,我们把执行时间>50ms的任务称为长任务,那么每个任务超过50ms的部分就是他的阻塞时间。

TBT就是阻塞时间的总和,举例子,如果在FCP和TTI之间进行了3个长任务,分别为 60ms 100ms 200ms

那么我们TBT 则等于 (60-50)+(100-50)+(200-50) = 210 ms

这个指标并非直接体现性能,但是他是我们去优化FID的重要依据。

我们现在了解和如何评估页面的加载速度,响应速度和流程程度。

但是大家在开发过程中可能还会有一种情况,比如:

  • 页面内容已经加载完,但是样式还没有加载完成,那么等待样式加载完成,会出现文档"跳跃"的情况。

  • 图片没有设置宽度和高度,当图片比较大的时候,图片突然加载后,整个页面也会出现布局的"波动"

  • 这样的"波动"和"跳跃"其实都显示的是页面的不稳定,所以我们再来了解一个指标:CLS

6、CLS(Cumulative Layout Shift)(关键指标)

CLS代表着累计位移偏移,记录了页面上非预期的位移波动,主要通过位移影响的面积和位移距离来计算。

比如页面渲染过程中突然插入一张巨大的图片导致其他元素发生偏移等,这个也是相当影响用户体验的内容。

ae3580217f0200bee8502a325fba9f8e.png

如上图所示,我们计算方式是

移动距离 = 20% 

影响面积 = 45% 前后总共影响的屏幕面积

那么 CLS 为  0.2 * 0.45 = 0.09

CLS的指标如下表所示:


GOOD

NEEDS
IMPROVEMENT

POOR

CLS number

<0.1

0.1-0.25

>0.25

到这里我们已经了解了很多指标

  • 如何去衡量页面加载速度:FCP、LCP

  • 如何去衡量页面的操作流畅度:FID、TTI、TBT

  • 如何去衡量页面的视觉稳定程度:CLS

但是在我们日常的关注性能的时候,只需要死磕最重要的三个核心指标,他们往往是影响页面感知性能的最关键点。

fa8082e89b5da89466fea45183da541d.png

二、常见指标检测工具及使用方法简介

1、通过谷歌浏览器的Performance来录制页面的指标

69552cc57a2add3d9c777dd044ec0ad2.png

我们的老朋友,Chrome的DevTools

我们切换到Performace中,点击左上角的就可以开始录制。

但是值的注意是的,因为目前电脑的CPU和手机的CPU还是无法比较。

当我们想要去录制手机性能时,需要点击配置,把CPU降速4倍(选择4x slowdown)才可以更好模拟手机的运行效果,这样我们可以不被电脑的"高性能"蒙骗。

2、重要的性能优化好帮手:Lighthouse

同样谷歌DevTools自带Lighthouse 可以快速生成一个报告。

但是也更加推荐使用 lighthouse 使用NPM安装并且通过命令行生成。

通过命令行生成的有2个好出,一是可以把每次报告保存下来,二是可以自动化定期检测性能和发现问题。

通过Lighthouse生成出来的报告如下图:

2620626facee8ff0d142cde85496e955.png

不仅仅可以给出详细的报告,并且还给了非常多的优化建议和优化路径,这个也是我们做性能优化的最重要的工具

c1081db8dd011cf9c667903ce2c5a3f5.png

最重要的是Lighthouse 给出的所有建议,都非常重要和直观。

3、如果你希望在JS中获取这些指标

你可以使用:web-vitals

e6e406733e84b09093f1a20bc4fe9c17.png

这样我们可以自己去获取每个用户在真实情况中的指标,并且上报到服务端记录下来,作为我们性能优化的依据和素材。


4、在线化报告生成,更加接近真机效果  www.webpagetest.org

webpagetest可以生成详细的报告,也可以自己部署镜像去生成,并且所有的手机端是在真机下运行的。

6815699f6211b6226726f9d9af64c8d4.png

也有非常详细的指标甚至整个渲染过程的视频

f4b5ace1fe5a577d0f842a105ef9aa3a.png

相比Lighthouse 那么webpagetest则更像是辅助你分析性能的工具,可以展现给你所有的数据,等待着你去挖掘如何优化。

不过因为webpagetest是在线化的,所以在使用的时候需要科学上网,在高峰时期甚至还需要排队生成报告。


三、总结

针对商业软件产品而言,其性能表现往往会直接关系到它的生死存亡。

本次我们了解了性能优化的常见指标,以及他们的计算方式,同时我们也推荐了如何用工具去获得这些指标。

这些指标相当于是前端性能优化系列的入门课程,在后续的分享中,会分享如何优化这些指标已经如何在项目中落地。

小伙伴们是否等不及用这个工具去测试一下自己产品的前端性能呢。‍

------ END ------

作者简介

刘同学: 开发SM,目前负责数据分析平台相关开发工作。

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

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

相关文章

ELKstack-Elasticsearch各类安装部署方法

手动安装部署Elasticsearch 开篇 开篇闲话&#xff0c;如果是新人在接触ELKstack什么都不懂的情况下&#xff0c;可以先看看各位前人写的关于ELKstack的博客&#xff0c;如何对ELKstack部署安装及使用&#xff0c;但是别人的东西只能作为借鉴&#xff0c;在自己搭建使用一定要以…

Android之 如何在退出一个activity后,很好的取消AsyncTask继续运行

public class Task extends AsyncTask<Void, Void, Void>{Override protected Void doInBackground(Void... path) { // Task被取消了&#xff0c;马上退出循环 if(isCancelled()) return null; }Override public void onProgressUpdate(File... files) { // Task被取消了…

美国超人气漫画科普书!85%以上中学物理考点,5岁孩子秒懂物理

▲ 点击查看今年的高考&#xff0c;不得不说&#xff0c;一度被浙江学霸刷屏&#xff01;他总分720分&#xff0c;物理等3门满分的成绩&#xff0c;最终获得“浙江高考状元”。状元能摘得桂冠&#xff0c;除了日积月累的不断努力外&#xff0c;最重要的是&#xff0c;不断调整自…

我的博客初始化

我是一名在读学生&#xff0c;平时没有摘抄、写日记、笔记之类的习惯&#xff0c;自从在amobbs上发了一篇lwip的移植记录&#xff0c;得到大家的回响&#xff0c;对自己的工作也有了极大的鼓舞作用&#xff0c;也开始学着写一些学习的笔记。记录生活和学习的点滴&#xff0c;经…

gevent 学习笔记一

import geventdef a():print a starting....gevent.sleep(1)print a endingdef b():print b starting....gevent.sleep(1)print b endinggevent.joinall([gevent.spawn(a), gevent.spawn(b) ]) 结果显示&#xff0c;用gevent并不会因为gevent.sleep而造成阻塞,但用内置的time.s…

在.Net环境下使用elasticsearch实现大数据量的搜索

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域&#xff0c;Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。Elasticsearch使用标准的RESTful API和JSON。我们还用多种语言构建和维护客户机&#xff0c;如Java、Pyth…

鸿蒙手机启动器apk下载,澪Pro启动器本体下载最新版

澪Pro启动器本体下载最新版专为我的世界的玩家们打造&#xff0c;可以在这里自由安装不同mod&#xff0c;也可以自定义编辑丰富的游戏内容&#xff0c;感受全新精彩的沙盒冒险玩法乐趣&#xff0c;更有丰富的资源和皮肤提供给玩家们&#xff0c;畅爽的玩法模式&#xff0c;沉浸…

当前联机日志损坏恢复

2019独角兽企业重金招聘Python工程师标准>>> 环境模拟 删除状态为active的联机日志&#xff0c;然后强行关闭数据库 处理过程 SQL> startup ORACLE instance started. Total System Global Area 167772160 bytes Fixed Size 1260720 bytes Variable Size 1426071…

Android之 如何解决ScrollView 和ListView滑动冲突的问题如何解决ScrollView can host only one direct child

android 采用ScrollView布局时出现异常:ScrollView can host only one direct child。 解决办法:主要是ScrollView内部只能有一个子元素,即不能并列两个子元素,所以需要把所有的子元素放到一个LinearLayout内部或 RelativeLayout等其他布局 如何解决ScrollView 和ListVi…

mysql 中执行的 sql 注意字段之间的反向引号和单引号

如下的数据表 create table test( id int(11) not null auto_increment primary key, user varchar(100) not null, flag char(2) not null default ok ); 当查询时应该写成 $sql "select user from test where flagok "; 字段是数据表的&#xff0c;用 &#xff08…

权威杂志评选出的十个最伟大的公式,爱因斯坦的质能方程竟然只能排第六!简直神仙打架....

全世界只有3.14 % 的人关注了爆炸吧知识难决高下各有千秋当数学家得出方程式和公式&#xff0c;如同看到雕像&#xff0c;美丽的风景&#xff0c;听到优美的曲调等等一样而得到充分的快乐。——柯普宁公式&#xff0c;是数学世界中一道美丽的风景&#xff0c;一个小小的等式&am…

在Idea中测试各JVM语言的交互性

为什么80%的码农都做不了架构师&#xff1f;>>> 背景&#xff1a; 假设出现这样的场景&#xff0c;一个Java项目中&#xff0c;需要用其他语言来编写相关模块&#xff0c;但需要能被Java调用 测试工具&#xff1a;Idea12 测试语言&#xff1a;Groovy、Scala、Ko…

android pcm调节音量,调整PCM语音数据的音量

通过编程实现调整PCM的音量&#xff0c;具体做法是乘上一个固定的数&#xff0c;但是要考虑数据的溢出问题&#xff0c;代码如下&#xff1a;//调节PCM数据音量//comment : 对PCM数据的音量进行放大//parameter :// pData PCM数据// nLen PCM数据的长度// nBitsPerSample 每个S…

.NET 大会今日开幕 |这些白嫖福利不看肠子都悔青

{ 12.18 线上开幕 文末有福利 }2021 .NET 开发者大会&#xff0c;今日开幕你是否已经满怀期待&#xff0c;同时又有很多疑问“ 会场在哪里&#xff1f;” "哪些大咖会参加&#xff1f;"“ 技术主题有哪些&#xff1f;” “ 什么时间有福利&#xff1f;”…时间不多了…

Android之如何解决ScrollView起始位置不是最顶部的解决办法

最近遇到了打开带有ScrollView的页面布局默认起始位置不是最顶部的情况&#xff0c;最后发现问题是因为ScrollView内部嵌套了listview&#xff0c;只需要设置listview获取焦点为false即可。 listview.setFocusable(false); 如果内部嵌套的是其它&#xff0c;也是同样的处理方…

asp.net web常用控件FileUpload(文件上传控件)

2019独角兽企业重金招聘Python工程师标准>>> FileUpload控件的主要中能&#xff1a;向指定目录上传文件&#xff0c;该控件包括一个文本框和一个浏览按钮。 常用的属性&#xff1a;FileBytes&#xff0c;FileContent、FileName、HasFile、PostedFile。 常用的方法&a…

SQL、LINQ、Lambda 三种用法

颜色注释&#xff1a; SQL LinqToSql Lambda QA1、 查询Student表中的所有记录的Sname、Ssex和Class列。select sname,ssex,class from studentLinq: from s in Students select new { s.SNAME, s.SSEX, s.CLASS }Lambda: Students.Select( s…

android 拍照换头像,Android调用相机拍照,裁剪及更换头像功能的实现

1&#xff0c;点击弹出popwindow&#xff0c;选择相机或者相册这个就不多说了&#xff0c;在OnclickListener里写弹出的窗口位置和样式。2&#xff0c;选择拍照功能&#xff0c;调用手机相机。//调用相机Intent intent new Intent("android.media.action.IMAGE_CAPTURE&q…

win7 绑定arp

首先&#xff0c;需要查看可用网卡的id&#xff0c;使用命令netsh i i show interface &#xff1b; 再绑定arp地址&#xff0c;netsh -c "i i" add neighbors idx IP地址 MAC地址 &#xff1b; 若要删除绑定&#xff0c;可以使用netsh -c "i i" delete…