上报相关performance对象初略介绍

概述

最近在做一个上报相关的需求,该需求指定上班的内容中包含页面记载的事件、请求花费的事件、以及DOM渲染所要完成的时间等。
为此查阅了大量的文档,收集了很多资料,所以趁热打铁,把自己所了解的记录下来,方便以后查询。

performance对象介绍

浏览器暴露给js的一个接口,可以通过这个接口查看用户访问网站的连接建立时间、dns时间等信息。使用该api时需要在页面完全加载完成之后才能使用,最简单的办法是在window.onload事件中读取各种数据,因为很多值必须在页面完全加载之后才能得出。

浏览器支持情况

IE9和chrome6以上的版本都支持:

pc端

  1. window.performance : ie9
  2. window.webkitPerformance : chrome6-9
  3. window.performance : chrome10+

移动端

  1. android4.0

performance是ECMAScript5中新增的一个特性,对于该特性,所支持的浏览器并不多。

属性和方法

属性
  • performance.timing :performance对象的timing属性指向一个对象,它包含了各种与浏览器性能有关的时间数据,提供浏览器处理网页各个阶段的耗时,这也是本文介绍的重点。
  • performance.navigation :网页导航的相关对象。
  • performance.memory :浏览器内存情况相关对象。
方法
  • performance.getEntries :浏览器获取网页时,会对网页中每一个对象(脚本文件、样式表、图片文件等等)发出一个HTTP请求。
  • performance.mark:mark方法用于为相应的视点做标记。
  • performance.now:performance.now方法返回当前网页自从performance.timing.navigationStart到当前时间之间的微秒数(毫秒的千分之一)

上报相关内容

上报相关的内容,大部分在performance.timing里面,performance.timing中包含的属性有:

  • navigationStart:准备加载新页面的起始时间
  • redirectStart:如果发生了HTTP重定向,并且从导航开始,中间的每次重定向,都和当前文档同域的话,就返回开始重定向的timing.fetchStart的值。其他情况,则返回0
  • redirectEnd:如果发生了HTTP重定向,并且从导航开始,中间的每次重定向,都和当前文档同域的话,就返回最后一次重定向,接收到最后一个字节数据后的那个时间.其他情况则返回0
  • fetchStart:如果一个新的资源获取被发起,则 fetchStart必须返回用户代理开始检查其相关缓存的那个时间,其他情况则返回开始获取该资源的时间
  • domainLookupStart:返回用户代理对当前文档所属域进行DNS查询开始的时间。如果此请求没有DNS查询过程,如长连接,资源cache,甚至是本地资源等。 那么就返回 fetchStart的值
  • domainLookupEnd:返回用户代理对结束对当前文档所属域进行DNS查询的时间。如果此请求没有DNS查询过程,如长连接,资源cache,甚至是本地资源等。那么就返回 fetchStart的值
  • connectStart:返回用户代理向服务器服务器请求文档,开始建立连接的那个时间,如果此连接是一个长连接,又或者直接从缓存中获取资源(即没有与服务器建立连接)。则返回domainLookupEnd的值
    -(secureConnectionStart):可选特性。用户代理如果没有对应的东东,就要把这个设置为undefined。如果有这个东东,并且是HTTPS协议,那么就要返回开始SSL握手的那个时间。 如果不是HTTPS, 那么就返回0
  • connectEnd:返回用户代理向服务器服务器请求文档,建立连接成功后的那个时间,如果此连接是一个长连接,又或者直接从缓存中获取资源(即没有与服务器建立连接)。则返回domainLookupEnd的值
  • requestStart:返回从服务器、缓存、本地资源等,开始请求文档的时间
  • responseStart:返回用户代理从服务器、缓存、本地资源中,接收到第一个字节数据的时间
  • responseEnd:返回用户代理接收到最后一个字符的时间,和当前连接被关闭的时间中,更早的那个。同样,文档可能来自服务器、缓存、或本地资源
  • domLoading:返回用户代理把其文档的 "current document readiness" 设置为 "loading"的时候
  • domInteractive:返回用户代理把其文档的 "current document readiness" 设置为 "interactive"的时候.
  • domContentLoadedEventStart:返回文档发生 DOMContentLoaded事件的时间
  • domContentLoadedEventEnd:文档的DOMContentLoaded 事件的结束时间
  • domComplete:返回用户代理把其文档的 "current document readiness" 设置为 "complete"的时候
  • loadEventStart:文档触发load事件的时间。如果load事件没有触发,那么该接口就返回0
  • loadEventEnd:文档触发load事件结束后的时间。如果load事件没有触发,那么该接口就返回0

上报的内容

上报的内容是通过上面的performance.timing各个属性的差值组成的,常用的有:

  • DNS查询耗时 :domainLookupEnd - domainLookupStart
  • TCP链接耗时 :connectEnd - connectStart
  • request请求耗时 :responseEnd - responseStart
  • 解析dom树耗时 : domComplete - domInteractive
  • 白屏时间 :responseStart - navigationStart
  • domready时间 :domContentLoadedEventEnd - navigationStart
  • onload时间 :loadEventEnd - navigationStart

帮助文档

performance对象:高精度时间戳

window.performance 详解

使用简洁的 Navigation Timing API 测试网页加载速度(不完全译文)

Chrome Developer Tools之网络监控与调优

关键字搜索:performance.timing 、performance 上报

### JavaScript Performance API 使用方法及属性介绍 #### 1. `performance.now` 方法 `performance.now()` 是一种高精度的时间测量工具,它返回自页面加载以来经过的毫秒数,精确到微秒级别。这种方法非常适合用于性能分析中的时间差计算[^1]。 ```javascript const start = performance.now(); // 执行一些操作... for (let i = 0; i < 1e7; i++) {} const end = performance.now(); console.log(`执行耗时: ${end - start} ms`); ``` --- #### 2. 获取导航性能数据 通过调用 `performance.getEntriesByType('navigation')` 可以获取关于页面导航的信息,例如加载时间和重定向次数等[^2]。 ```javascript const navigationData = performance.getEntriesByType('navigation'); if (navigationData.length > 0) { console.log(navigationData[0].type); // 导航类型(如 'navigate', 'reload') console.log(navigationData[0].duration); // 页面加载总耗时 } ``` --- #### 3. 支持的资源类型 Performance API 提供了多种类型的性能指标,这些类型可以通过 `PerformanceObserver.supportedEntryTypes` 属性查询。以下是常见的几种: - **Navigation**: 表示整个页面的加载过程。 - **Resource**: 记录外部资源(如图片、脚本)的加载情况。 - **Paint**: 跟踪首次绘制和内容可见的时间点。 - **Long Task**: 检测主线程上超过 50ms 的阻塞任务。 具体实现如下所示[^3]: ```javascript console.log(PerformanceObserver.supportedEntryTypes); // 输出可能为 ["element", "event", ..., "navigation", "paint", "resource"] ``` --- #### 4. 创建 Performance Observer 实例 为了监听特定事件并捕获其性能记录,可以创建一个 `PerformanceObserver` 对象实例。这有助于实时监控某些性能度量的变化。 ```javascript new PerformanceObserver((list, observer) => { list.getEntries().forEach(entry => { if (entry.entryType === 'paint') { console.log(`${entry.name}: ${entry.startTime}`); } }); }).observe({ type: 'paint', buffered: true }); ``` 上述代码片段会观察所有的 paint 类型条目,并打印它们的名字及其启动时间。 --- #### 5. 测量标记之间的间隔 利用 `performance.mark`, `performance.measure` 和其他关联函数能够定义自定义时间段以便更精细地控制性能评估流程。 ```javascript performance.mark('start-mark'); function heavyComputation() { let sum = 0; for (let i = 0; i < 1e8; ++i) { sum += Math.random(); } } heavyComputation(); performance.mark('end-mark'); performance.measure('computation-time', 'start-mark', 'end-mark'); const measures = performance.getEntriesByName('computation-time'); console.log(measures[0].duration); // 清理已使用的 mark/measure 数据 performance.clearMarks(); performance.clearMeasures(); ``` 此段程序展示了如何设置两个标志位以及衡量两者间所花费的实际运算周期长度。 --- ### 总结 JavaScript Performance API 不仅提供了丰富的接口来帮助开发者深入了解应用的表现状况,还允许我们针对不同场景采取相应的优化策略。无论是简单的计时还是复杂的网络请求追踪,都可以借助这一强大功能完成高效调试工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值