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

news2024/11/23 11:05:23

前言

前段时间在研究前端异常监控平台,在思考性能监控时,想到了浏览器自带的观察者以及页面生命周期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.coloradmin.cn/o/1986813.html

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

相关文章

ArcGIS基础:二维面要素生成三维体模型

如下,为处理前的二维数据图斑以及需要用到的字段【高度】 使用ArcScene软件打开,找到【拉伸】设置,按照下述顺序进行设置参数,在【拉伸值或表达式】里选择【高度】字段 如下所示,就可以完成二维数据的三维表达&#x…

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

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

2020C题 中小微企业的信贷决策论文分析复现笔记

比赛题目: 在实际中,由于中小微企业规模相对较小,也缺少抵押资产,因此银行通常是依据信贷政策、企业的交易票据信息和上下游企业的影响力,向实力强、供求关系稳定的企业提供贷款,并可以对信誉高、信贷风险…

“MySQL中的空间索引技术深度解析:利用Spatial Key优化地理空间数据查询“

目录 简介 空间数据类型 GEOMETRY(抽象基类) POINT LINESTRING POLYGON MULTIPOINT MULTILINESTRING MULTIPOLYGON GEOMETRYCOLLECTION 总结 函数 ST_GeomFromText() ST_X ST_Y ST_AsText 空间函数 总结 坐标系 WGS 84坐标系&#x…

03 LVS+Keepalived群集

3.1 Keepalived 双机热备基础知识 Keepalived 起初是专门针对 LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检査(HealthChecking)功能--判断LVS 负载调度器、节点服务器的可用性,当 master 主机出现故障及时切换到 backup 节点保…

(二十二)【Jmeter】深入刨析监听器:常用监听器常用使用场景、优缺点及操作实例

简述 在Jmeter中,监听器(Listener)是一个重要的组件,用于收集和显示测试结果。监听器的作用包括: 收集测试结果:监听器可以实时收集JMeter测试执行过程中的数据,包括请求和响应的各种信息。显示测试结果:监听器可以将收集到的测试结果以不同的方式展示出来,例如以树状…

【第七节】python多线程及网络编程

目录 一、python多线程 1.1 多线程的作用 1.2 python中的 threading 模块 1.3 线程锁 二、python网络编程 2.1 通过socket访问网络 2.2 python2.x中的编码问题 2.3 python3的编码问题 一、python多线程 1.1 多线程的作用 多线程技术在计算机编程中扮演着重要的角色&a…

五大避坑要点,让你轻松避开99%的雷区!随身wifi京东口碑排行榜,随身wifi推荐第一名!

在数字浪潮中,随身WiFi成为我们不可或缺的伴侣,但市场纷繁复杂,如何挑选成为难题。以下五大避坑要点,让你轻松避开99%的雷区! 1.避小就大,信赖旗舰店:远离无名小品牌,选择知名品牌的…

Javacript 高级程序设计(系统学习)

以下为阅读 《Javacript 高级程序设计》部分笔记,待继续完善,后续会进行章节拆分。 第1章 什么是 javascript 历史回顾js 实现 / es / dom / bomjs 版本 javascript 最初为什么设计为单线程? JavaScript 最初设计为单线程的主要原因是出于简…

体验 Whisper ,本地离线部署自己的 ASR 语音识别服务

需求背景 最近看视频,过几天后经常忘记内容,所以有了把重点内容总结提炼到自己知识库的需求,这涉及到了提取视频中的音频数据、离线语音识别等功能。 提取视频中的音频数据,可以使用格式工厂或 FFmpeg 等工具, FFmpe…

详细解析socket

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

书生大模型实战营第三期——入门岛——Git基础知识

第三关:Git基础知识 任务如下: 任务描述 破冰活动:自我介绍 每位参与者提交一份自我介绍。 提交地址:GitHub - InternLM/Tutorial: LLM&VLM Tutorial 的 camp3 分支~实践项目:构建个人项目 创建一个个人…

PDF发票解析并将信息回填到前端(2)前端页面

本人前端基础薄弱,此处的前端仅仅是一个练习展示 1. 创建一个前端项目 打开终端使用以下命令创建一个基于webpack模板的新项目 vue init webpack my-project输入命令之后一直点击enter知道项目创建完成即可 进入项目,安装并运行 $ cd my-project //…

ExtJS生成日历组件

文章目录 1.添加日历组件代码2.引入日历组件,创建了补签和取消签到,以及翻页显示的事件 1.添加日历组件代码 首先找到自己项目中对应的Ext的目录,并将日历组件添加到calendar这个目录下,我的是KwDatePicker.js 日历组件代码如下: Ext.define(Ext.calendar.KwDatePicker, {ex…

python six模块是什么

six模块是Python2和3兼容性库,它是为了解决Python2和Python3代码兼容性而产生的,众所周知Python2和Python3版本的分裂给Python开发者们带来了很大的烦恼,为了使代码同时兼容两个版本,往往要增加大量的代码,典型的就有u…

著名人工智能新经济数字经济新能源新质生产力讲师培训师教授专家唐兴通分享人工智能社会学商业模式创新人工智能就业工作与教育学习出海跨境数字化转型数字营销数字销售

添加图片注释,不超过 140 字(可选) 2024 年是人工智能在工作中真正应用的一年。根据微软和领英进行的调查(2024年5月),在过去六个月中,生成式人工智能的使用量几乎翻了一番,全球75%的…

领夹麦克风哪个品牌音质最好?八月领夹式麦克风排行榜

随着移动互联技术的飞速发展,视频内容的消费与创作正以前所未有的速度增长。从直播带货的兴起,到短视频平台的火爆,音频质量作为内容体验的重要组成部分,越来越受到创作者的重视。在这一背景下,无线领夹麦克风凭借其小…

6-8 残差网络(ResNet)

随着我们设计越来越深的网络,深刻理解“新添加的层如何提升神经网络的性能”变得至关重要。更重要的是设计网络的能力,在这种网络中,添加层会使网络更具表现力, 为了取得质的突破,我们需要一些数学基础知识。 残差网络…

Web端高效元件库——高端元件,匠心设计

原型设计,不仅是产品从构想到落地不可或缺的桥梁,更是深化用户体验优化策略的核心环节。Axure,作为原型设计领域的领航者,凭借其卓越的交互设计引擎与无与伦比的灵活性,赢得了产品设计师们的广泛赞誉,成为他…

NiFi :1 初识这把“十年一剑”的利器

--->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<--- “现在AI和数据处理密不可分&#xff0c;80%的企业可以利用Apache NiFi轻松解决复杂的数据问题&#xff0c;快速完成场景建设。犹如花上百来块钱在家享受一顿不亚于五星级西餐厅的法式大餐。对…