这里是以前自己关于性能指标与评估工具的相关笔记,下面主要是关于性能指标的定义与特性以及相关的评估工具,并没有记录深入。
下面是推荐阅读的博客:
前端性能优化-性能指标 - 掘金
性能是相对的!!!!
网页的加载速度,响应速度等会受到网速,设备等指标的影响,所以这个时候需要进行一些定量测量的客观标准来评价性能。
长久以来,网络性能都是通过load
事件进行测量的。然而,尽管load
是页面生命周期中明确定义的时刻,但该时刻并不一定与用户在意的任何方面相对应。
是否正在发生? | 导航是否成功启动?服务器有响应吗? |
---|---|
是否有用? | 是否渲染了足够的内容让用户可以深入其中? |
是否可用? | 页面是否繁忙,用户是否可以与页面进行交互? |
是否令人愉快? | 交互是否流畅自然,没有延迟和卡顿? |
真实指标、实验室指标、用户感知指标 、自定义指标
在实验室中:使用工具在稳定、受控的环境中模拟页面加载
在实际情况中:基于真实用户的实际页面加载与页面交互
虽然实验室指标可以对前端性能进行一个比较合理的评价,但是这不能反映所有用户在实际情况下对前端界面的使用。比如我在微信开发工具中使用不同的模拟机去模拟,但是也是无法覆盖所有手机的真实情况,比如有的手机是曲面屏,字体设置大小可能也不一样,而且我所测试的模拟机的网络状态也可能跟多数用户的网络状态不一样。也就是这种用户的设备,个性化或者状态的不确定性,所以我们不能只使用实验室的指标进行评价。
如果想要真实的了解前端界面的性能,还是得进行实测,也就是利用真实指标来评价前端界面(RUM)。除此之外,其实还有用户感知指标(主要在加载速度、响应速度、平滑度的感知方面)
自定义指标:
💡 简述:
指标的话可以分为四种,实验室指标,真实指标,用户感知指标和自定义指标。
实验室指标主要有可交互时间TTI和总阻塞时间TBT。
真实指标主要有首次内容绘制时间FCP,最大内容绘制时间LCP,累积布局偏移时间CLS,首次输入延迟时间FID,其中前三个为实验室和真实均可用。
用户感知指标主要是指用户的感知的速度,视觉稳定性,平滑度。
自定义指标我了解到的主要是通过一些API来实现,比如服务器计时API,资源计时API等。
评估工具——谷歌开发工具,Lighthouse,PageSpeed Insights,web pagetest,Pingdom
首次内容绘制FCP指的是页面加载过程中出现第一个元素的时间(部分渲染),是用于度量感知加载速度(用户肉眼可观察)的重要指标。它标记了页面加载时间轴上的第一个点,在这个时间点用户可以看到页面出现了具体内容。
示例:First contentful paint 首次内容绘制 (FCP):测量页面从开始加载到页面内容的任何部分在屏幕上完成渲染的时间。(实验室、实际)
代码实现
import {getFCP} from 'web-vitals';
// Measure and log FCP as soon as it's available.
getFCP(console.log);
最大内容绘制LCP指的时页面加载过程中,主要内容已经全部加载的时间(主要内容全部渲染),是用于度量感知加载速度(用户肉眼可观察)的重要指标。它标记了页面加载时间轴上的一个点,在这个时间点页面的主要内容已经加载(比如图像,视频【使用封面图片的】,文本节点或者其他内联元素或者块级元素)。控制在 2.5s 的范围内
示例:Largest contentful paint 最大内容绘制 (LCP):测量页面从开始加载到最大文本块或图像元素在屏幕上完成渲染的时间。(实验室、实际)
代码实现
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
console.log('LCP candidate:', entry.startTime, entry);
}
}).observe({type: 'largest-contentful-paint', buffered: true});
累积布局偏移 (CLS)度量的是在页面的整个生命周期中每一次意外布局移位的总和。
示例:Cumulative layout shift 累积布局偏移 (CLS):测量页面在开始加载和其生命周期状态变为隐藏期间发生的所有意外布局偏移的累积分数。(实验室、实际)
代码
layout shift score = impact fraction * distance fraction
impact fraction 表示不稳定元素对两帧间视口区域的影响。
let cls = 0;
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (!entry.hadRecentInput) {
cls += entry.value;
console.log('Current CLS value:', cls, entry);
}
}
}).observe({type: 'layout-shift', buffered: true});
首次输入延迟 (FID)是指用户从第一次与页面交互到前端界面真正能够开始处理时间处理程序以响应交互的时间。(仅仅是事件处理的延迟!!!)
一般 input 延迟是因为浏览器主线程繁忙不能及时响应用户,最通常的原因就是浏览器忙于处理和执行大的 JavaScript 文件。
FID 度量的仅仅是事件处理的延迟,它不会考虑事件处理时间本身和浏览器在执行事件处理程序之后更新页面 UI 的时间。
示例:First input delay 首次输入延迟 (FID):测量从用户第一次与您的网站交互(例如当他们单击链接、点按按钮或使用由 JavaScript 驱动的自定义控件)直到浏览器实际能够对交互做出响应所经过的时间。(实际)
代码
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
const delay = entry.processingStart - entry.startTime;
console.log('FID candidate:', delay, entry);
}
}).observe({type: 'first-input', buffered: true});
意外的偏移
,并对用户交互造成潜在的干扰?是否具有稳定的帧速率和顺滑的流动性?
谷歌开发工具,Lighthouse,PageSpeed Insights,web pagetest,Pingdom…