前端监控性能指标

本文探讨前端性能监控的关键指标,包括阶段性指标、关键性能指标和小程序。详细解析W3C Level 1的Nav Timing,如计算HTML文档请求、静态资源加载,并提醒注意secureConnectionStart等问题。此外,还介绍了W3C Level 2的新特性,如Paint Timing和User Timing,以及上报数据的策略。
摘要由CSDN通过智能技术生成

前端监控性能指标

原文链接

性能指标

timestamp-diagram

阶段性指标

字段 描述 计算方式 备注
unload 前一个页面卸载耗时 unloadEventEnd - unloadEventStart 前一个页面卸载时可能监听了 unload 做些数据收集,会影响页面跳转
redirect 重定向耗时 redirectEnd - redirectStart 过多重定向影响性能
appCache 缓存耗时 domainLookupStart - fetchStart
dns DNS 解析耗时 domainLookupEnd - domainLookupStart
tcp TCP 连接耗时 connectEnd - connectStart
ssl SSL 安全连接耗时 connectEnd - secureConnectionStart 只在 HTTPS 下有效
ttfb Time to First Byte(TTFB),网络请求耗时 responseStart - requestStart
response 数据传输耗时 responseEnd - responseStart
dom 可交互 DOM 解析耗时 domInteractive - responseEnd Interactive content
dom2 剩余 DOM 解析耗时 domContentLoadedEventStart - domInteractive DOMContentLoaded 所有DOM元素都加载完毕(除了 async script)
DCL DOMContentLoaded 事件耗时 domContentLoadedEventEnd - domContentLoadedEventStart document.addEventListener(‘DOMContentLoaded’, cb)
resources 资源加载耗时 loadEventStart - domContentLoadedEventEnd 完整DOM(DOMContentLoaded)到资源加载完毕(window.onLoad)时间
onLoad onLoad事件耗时 loadEventEnd - loadEventStart

关键性能指标

字段 描述 计算方式 备注
firstbyte 首包时间 responseStart - domainLookupStart
fpt First Paint Time, 首次渲染时间 / 白屏时间 responseEnd - fetchStart 从请求开始到浏览器开始解析第一批 HTML 文档字节的时间差
tti Time to Interact,首次可交互时间 domInteractive - fetchStart 浏览器完成所有 HTML 解析并且完成 DOM 构建,此时浏览器开始加载资源
ready HTML 加载完成时间, 即 DOM Ready 时间 domContentLoadedEventEnd - fetchStart 如果页面有同步执行的 JS,则同步 JS 执行时间 = ready - tti
load 页面完全加载时间 loadEventStart - fetchStart load = 首次渲染时间 + DOM 解析耗时 + 同步 JS 执行 + 资源加载耗时

小程序

字段 描述 计算方式 备注
fpt First Paint Time, 首次渲染时间 onShow (first page) - onLaunch (app) 小程序从 onLaunch 到第一个页面 onShow 之间的时间

W3C Level 1

兼容性

navigation-timing1

常规用法

  • 计算主页面
const t = performance.timing;

const pageloadtime = t.loadEventStart - t.navigationStart,
  dns = t.domainLookupEnd - t.domainLookupStart,
  tcp = t.connectEnd - t.connectStart,
  ttfb = t.responseStart - t.navigationStart;
  • 计算页面资源
const r0 = performance.getEntriesByType('resource')[0];

const loadtime = r0.duration,
  dns = r0.domainLookupEnd - r0.domainLookupStart,
  tcp = r0.connectEnd - r0.connectStart,
  ttfb = r0.responseStart - r0.startTime;

注意事项

1、计算HTML文档请求使用 Nav Timing

获取主页 html 数据,应该使用 performance.timing,而不是 performance.getEntriesByType('resource')[0]

performance.getEntriesByType('resource') 表示当前 HTML 文档中引用的所有静态资源信息,不包括本身 HTML 信息。

如果当前不包含任何静态资源那么 performance.getEntriesByType('resource') === [] 使用 [0].xx 会报错。

2、计算静态资源使用 getEntriesByType(‘resource’) 代替 getEntries()

getEntries() 包含以下六种类型

  1. navigation
  2. resource
  3. mark
  4. measure
  5. paint
  6. frame

在比较老的浏览器中,getEntries() 通常情况下一般只有 resource 类型等同于 getEntriesByType('resource')
因为 navigationNavigation Timing 2 规范,老的浏览器不支持。而 markmeasureUser Timing 用户自定义类型。
最后两个对于目前(2020年) 来说实现的浏览器就更少了。

所有使用 getEntries() 来检索静态资源都需要过滤其他几种类型,getEntriesByType('resource') 就很明确。

3、secureConnectionStart 问题

secureConnectionStart 用来测量 SSL协商 所花费的时间,可能有三种值

  1. undefined,浏览器不支持该属性;
  2. 0,未使用 HTTPS;
  3. timestamp 时间戳,使用了 HTTPS

chrome 很老的版本有一个 bug,当获取资源复用了已建立的 HTTPS 信道时,secureConnectionStart 设置为 0 了,按标准应该设置为时间戳。

取值时应该避免不支持和未使用的情况

const r0 = performance.getEntriesByType('resource')[0];
if ( r0.secureConnectionStart ) {
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值