Web性能监测的利器Performance Observer!!

前言

前段时间在研究前端异常监控平台,在思考性能监控时,想到了浏览器自带的观察者以及页面生命周期API 。于是在翻查资料时发现了,Performance ObserverAPI。正好趁着这个机会给大家好好讲讲Performance Observer API

Performance Observer(性能观察者)

定义

Performance Observer是一种JavaScript API,用于监测页面性能指标,如资源加载时间、页面渲染时间等。它可以触发回调函数,以便你收集和分析页面性能数据。

优点

  1. 性能监测:可以监测页面性能,以便发现性能问题并进行优化。
  2. 丰富的性能指标:提供了多种性能指标,如资源加载时间、首次绘制时间等,帮助开发人员深入了解页面性能。
  3. 跨浏览器支持:Performance Observer是一个标准的Web API,被主流浏览器支持。

应用场景

  • 性能优化:可以使用Performance Observer来监测页面性能,以发现潜在的性能瓶颈并进行优化。
  • 用户体验分析:可以收集性能数据,以分析用户在页面加载和交互过程中的体验。
  • 性能报告:可以生成性能报告,以帮助开发团队了解页面性能的历史数据。

用法

1.创建Performance Observer实例

首先,我们需要创建一个Performance Observer的实例。它需要一个回调函数作为参数,这个回调函数会在性能指标发生变化时被触发。

const observer = new PerformanceObserver(callback);

2.指定要观察的性能条目类型

然后,我们需要指定要观察的性能条目类型。性能条目类型是一个配置对象,包括以下属性:

  • entryTypes:一个数组,包含要观察的性能条目类型。

    可以填的值包括:
    frame: 指的是整个页面,包括页面的导航性能和整体加载时间。它可以监测与整个页面的性能相关的数据。 
    navigation: 与页面导航和加载时间相关,提供有关导航事件(如页面加载、重定向等)的性能数据。
    resource: 与页面中加载的各种资源相关,如图像、脚本、样式表等。它可以监测单个资源的加载性能,包括资源的开始和结束时间,以及其他相关信息。
    mark: 与性能标记(mark)相关,性能标记是在代码中设置的时间戳,通常用于记录特定事件的时间,以便后续性能分析。这提供了在页面加载期间创建性能标记的方式。
    measure: 与性能测量(measure)相关,性能测量用于测量两个性能标记之间的时间间隔,以获取更详细的性能数据。这提供了测量和分析特定事件之间的时间差的方式。
    paint: 与页面绘制性能相关,可以是 "first-paint"(首次绘制)或 "first-contentful-paint"(首次内容绘制)之一。这些指标表示页面呈现的关键时间点,可以帮助我们评估用户视觉上的加载体验。
    

代码示例:

observer.observe({ entryTypes: ['resource', 'paint'] });

3.编写回调函数

回调函数会在性能指标发生变化时被触发,它接受一个参数:entries,它是一个性能条目对象的数组,每个对象描述了一个性能条目。


const callback = entries => {entries.forEach(entry => {// 处理性能指标数据});
};

4.Performance的方法

observe方法

observe方法用于启动性能观察器以开始监测指定类型的性能条目。options 方法接受一个参数,参数要求是对象形式,其中包含要监测的性能条目类型(entryTypes)和一个回调函数,用于处理观察到的性能条目。当指定的性能条目可用时,会触发回调函数。

参数包含的值:

  • entryTypes(必需): 一个字符串数组,用于指定要监测的性能条目类型。

  • buffered(可选):一个布尔值,指示是否应该检查已缓冲的性能条目(默认为 false)。如果设置为 true,则性能观察器将检查在调用 observe 之前已经发生的性能条目。

  • transferMode(可选) 一个字符串,用于指定如何传输性能条目。可以包括以下值:

    • “report”:默认值,性能条目将通过回调函数进行报告。
    • “accumulate”:性能条目将积累并传递给回调函数。

代码示例:

observer.observe({entryTypes: ['navigation', 'resource'],buffered: true, // 检查已缓冲的性能条目 transferMode: 'report', // 默认值,性能条目通过回调函数进行报告 
});
disconnect()方法

用于停止性能观察器的观察,即停止监测性能条目。一旦调用 disconnect 方法,性能观察器将不再触发回调函数。

代码示例:

observer.disconnect(); // 调用 disconnect 方法停止性能观察
takeRecords()方法

用于获取当前性能观察器队列中尚未传递给回调函数的性能条目。这些性能条目会从队列中移除,并以数组的形式返回。这可以在停止观察之前用于检索观察到的性能数据。

代码示例:

// 创建一个 PerformanceObserver 对象
const observer = new PerformanceObserver((list) => {const entries = list.getEntries();for (const entry of entries) {// 处理性能数据的代码console.log(entry);}
});// 配置性能观察器以监测导航性能
observer.observe({ entryTypes: ['navigation'] });// 某些时间后,手动获取尚未传递的性能条目
setTimeout(() => {const unprocessedEntries = observer.takeRecords();for (const entry of unprocessedEntries) {// 处理尚未传递的性能数据的代码console.log('Unprocessed entry:', entry);}
}, 5000); // 在5秒后手动获取尚未传递的性能条目

代码实战

我们可以创建一个PerformanceObserver 对象,来监听 mark(时间点)、measure(时间段)、resource(资源加载耗时) 这三种记录时间的行为。

然后我们用 mark 记录了某个时间点,点击 button 的时候用 measure 记录了某个时间段的数据,还加载了一个图片。

当这些记录行为发生的时候我么把性能数据打印在控制台或者上报给我们的监控系统。

动画.gif

jcode

mark(时间点)数据

image.png

  • name(名称):性能标记的名称,这里是 “translate:initiated”。它表示一个特定时间点的标记,通常用于记录页面加载过程中的关键时间点或事件。
  • entryType(条目类型):指示性能条目的类型,对于 PerformanceMark 来说,它是 “mark”,表明这是一个性能标记的条目。
  • startTime(开始时间):性能标记的时间戳,以浏览器的导航开始时间为基准,通常以毫秒(ms)为单位。在这个例子中,标记的时间是从导航开始时开始计算的,为 342.6 毫秒。
  • duration(持续时间):对于 PerformanceMark 来说,它始终是 0,因为标记只表示一个瞬时的时间点,没有持续时间。

measure(时间段)数据

image.png

  • "name": "button clicked":这是性能测量的名称。它表示测量的类型或描述,这里是 “button clicked”,表明这个测量是与按钮点击事件相关的。
  • "entryType": "measure":这表示这个性能条目的类型是 “measure”。
  • "startTime": 0:这是测量的开始时间,
  • "duration": 4088.7999999523163:这是性能测量的持续时间,表示从测量开始到测量结束的时间差,同样以毫秒(ms)为单位。在这里,测量的持续时间为 4088.8 毫秒,表示按钮点击事件的执行时间。

(图片)资源加载性能

image.png

  • name(名称):资源的名称或 URL。
  • entryType(条目类型):指示性能条目的类型,对于 PerformanceResourceTiming 来说,它是 “resource”,表明这是一个与资源加载性能相关的条目。
  • startTime(开始时间):资源加载开始的时间,以浏览器的导航开始时间为基准,通常以毫秒(ms)为单位。在我们这个例子中,资源加载开始于 301.4 毫秒。
  • duration(持续时间):资源加载的持续时间,以毫秒(ms)为单位。这个资源加载持续时间为 0,表示加载是瞬时完成的。
  • initiatorType(发起者类型):指示加载资源的方式或来源类型。这里是 “img”,表示该资源是通过 img 元素加载的。
  • nextHopProtocol(下一跳协议):资源加载时使用的网络协议,这里为空白,表示未指定。
  • renderBlockingStatus(阻塞状态):指示资源加载是否会阻塞渲染。这里是 “non-blocking”,表示该资源加载不会阻塞页面的渲染。
  • workerStart:相关于资源加载的事件,这里是 0,表示资源加载事件尚未开始。
  • redirectStartredirectEnd:相关于重定向的事件,这里都是 0,表示没有发生重定向。
  • fetchStart:资源请求开始的时间,与导航开始时间的时间差,这里是 301.4 毫秒。
  • domainLookupStartdomainLookupEnd:与域名解析(DNS 查询)相关的事件,这里都是 0,表示域名解析尚未发生。
  • connectStartconnectEnd:与建立连接相关的事件,这里都是 0,表示尚未建立连接。
  • 其他属性,如 secureConnectionStartrequestStartresponseStart 等,用于记录资源加载过程中的不同事件时间。
  • transferSizeencodedBodySizedecodedBodySize:与资源大小和传输相关的属性。在这个例子中,它们都为 0,表示资源大小很小,没有传输。
  • responseStatus:资源加载的响应状态码,这里是 0,表示没有响应状态码。
  • serverTiming:服务器定时信息,通常用于记录服务器端性能信息。

总结

有了Performance Observer API,后,我们可以更精确地监测和分析网页的性能表现,它可以帮助我们发现和解决潜在的性能问题。但是我们在使用的时候还是需要小心地选择要监测的内容,避免引入额外的性能开销,特别是在处理大量数据时。

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

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

相关文章

【python】Scrapy中常见的“Response Not Ready”或“Response Not 200”错误分析及解决

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

吴恩达机器学习笔记

1.机器学习定义: 机器学习就是让机器从大量的数据集中学习,进而得到一个更加符合现实规律的模型,通过对模型的使用使得机器比以往表现的更好 2.监督学习: 从给定的训练数据集中学习出一个函数(模型参数)…

【Jenkins未授权访问漏洞 】

默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器权限。 第一步:使用fofa语句搜索 搜索语句: port&…

【八股文】Redis

1.Redis有哪些数据类型 常用的数据类型,String,List,Set,Hash和ZSet(有序) String:Session,Token,序列化后的对象存储,BitMap也是用的String类型,…

CCRC-CISAW信息安全保障人员证书含金量

在数字化时代背景下,CISAW认证受到越来越多个人的青睐。 特别是在互联网技术高速发展的今天,随着5G技术的广泛应用,市场对CISAW专业人才的需求急剧增加。 这种职业不仅地位显著,而且职业生涯相对较长。 目前市场上,…

【leetcode详解】覆盖所有点的最少矩形数目(C++思路详解)

思路详解: 0. 题目情境并未限制矩形高度,故矩形数目的判断只和点的横坐标有关 1. 为了不重不漏地考虑到所有点,故笔者选择首先将二维数组中的点按横坐标的大小排序 //说明:本来笔者以为需要自定义sort排序,后来发现…

《嵌入式 - 嵌入式大杂烩》ARM Cortex-M寄存器详解

1 ARM Cortex-M寄存器概述 ARM Cortex-M提供了 16 个 32 位的通用寄存器(R0 - R15),如下图所示。前15个(R0 - R14)可以用作通用的数据存储,R15 是程序计数器 PC,用来保存将要执行的指令。除了通用寄存器,还有一些特殊功能寄存器。特殊功能寄存器有预定义的功能,而且必须通…

GPU 片上调度系统

这篇文章分析和说明GPU 片上的kernel 通过stream 作为载体是如何分发到SM 处理器上,同时CUDA 所抽象的grid/block/thread 在GPU 设备层面是如何调度的。调度器通常是被忽略的一个部分,但对CUDA kernel 的编写和后期系统性能分析很有帮助,也可…

将 Tcpdump 输出内容重定向到 Wireshark

在 Linux 系统中使用 Tcpdump 抓包后分析数据包不是很方便。 通常 Wireshark 比 tcpdump 更容易分析应用层协议。 一般的做法是在远程主机上先使用 tcpdump 抓取数据并写入文件,然后再将文件拷贝到本地工作站上用 Wireshark 分析。 还有一种更高效的方法&#xf…

【HarmonyOS】鸿蒙应用实现截屏

【HarmonyOS】鸿蒙应用实现截屏 组件截屏 通过componentSnapshot的get函数,将需要截图的组件设置id传进去即可。 import { componentSnapshot } from kit.ArkUI; import { image } from kit.ImageKit;/*** 截图*/ Entry Component Preview struct SnapShotPage {S…

sheng的学习笔记-AI-层次聚类

AI目录:sheng的学习笔记-AI目录-CSDN博客 需要学习的前置知识:聚类,可参考:sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 什么是层次聚类 层次聚类(hierarchical clustering)试图在不同层次对数据集进行划分,从而形…

【Python系列】使用 `isinstance()` 替代 `type()` 函数

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

国产版Sora复现——智谱AI开源CogVideoX-2b 本地部署复现实践教程

目录 一、CogVideoX简介二、CogVideoX部署实践流程2.1、创建丹摩实例2.2、配置环境和依赖2.3、上传模型与配置文件2.4、开始运行 最后 一、CogVideoX简介 智谱AI在8月6日宣布了一个令人兴奋的消息:他们将开源视频生成模型CogVideoX。目前,其提示词上限为…

thinkphp8开发的广告联盟网站系统源码

这款程序是采用国内主流的PHP框架,最新版本thinkphp8.0.4,也是目前市面上功能相对比较强大,界面比较好看的一款全开源的广告联盟系统,程序支持任意二开商业,并且代码无任何加密处理。 程序开发:PHPMySQL …

Windows使用wsl安装docker-desktop

一:修改Windows配置,启用相关功能。 1:启用硬件虚拟化VT-d 各品牌电脑的Bios设置都不一致,需要自行查找如何进入Bios开启VT-x功能,绝大部分电脑此功能默认情况下是直接开启的。 2:确定Windows系统的类别…

【全面介绍下Gitea,什么是Gitea?】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

日常生活中的卡片写作素材

日常生活中,有哪些内容适合写卡片? ​​我认为有两类非常值得写卡片,一类是经常重复说的内容,一类是给其他人提供价值的信息。 ​ ​ ​ 重复说的内容: ​​比如,你在工作中经常解答同事一些问题&a…

怎么限制电脑不能打开某个网页或网站(四个方法你可一定要学会)

老板:我公司的员工真的很让人头疼。 朋友:怎么了? 老板:我一不在就有人偷偷打开某些违法网站,画面不可描述啊! 朋友:难道你还不知道可以禁止员工打开某个网站? 老板:…

C++ QT开发 学习笔记(3)

C QT开发 学习笔记(3) - WPS项目 标准对话框 对话框类说明静态函数函数说明QFileDialog文件对话框getOpenFileName()选择打开一个文件getOpenFileNames()选择打开多个文件getSaveFileName()选择保存一个文件getExistingDirectory()选择一个己有的目录getOpenFileUrl()选择打幵…

【优秀python大屏案例】基于python flask的前程无忧大数据岗位分析可视化大屏设计与实现

随着大数据和人工智能技术的迅猛发展,数据分析和可视化在各个行业中的应用越来越广泛。特别是在招聘领域,大数据分析不仅能够帮助企业更好地了解市场需求,还能为求职者提供科学的职业规划建议。本文探讨了基于Python Flask框架的前程无忧大数…