文章目录
前端监控性能指标
性能指标
阶段性指标
字段 | 描述 | 计算方式 | 备注 |
---|---|---|---|
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
兼容性
常规用法
- 计算主页面
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()
包含以下六种类型
- navigation
- resource
- mark
- measure
- paint
- frame
在比较老的浏览器中,getEntries()
通常情况下一般只有 resource
类型等同于 getEntriesByType('resource')
。
因为 navigation
是 Navigation Timing 2
规范,老的浏览器不支持。而 mark
和 measure
是 User Timing
用户自定义类型。
最后两个对于目前(2020年) 来说实现的浏览器就更少了。
所有使用 getEntries()
来检索静态资源都需要过滤其他几种类型,getEntriesByType('resource')
就很明确。
3、secureConnectionStart 问题
secureConnectionStart
用来测量 SSL协商
所花费的时间,可能有三种值
- undefined,浏览器不支持该属性;
- 0,未使用 HTTPS;
- timestamp 时间戳,使用了 HTTPS
chrome 很老的版本有一个 bug,当获取资源复用了已建立的 HTTPS 信道时,secureConnectionStart
设置为 0 了,按标准应该设置为时间戳。
取值时应该避免不支持和未使用的情况
const r0 = performance.getEntriesByType('resource')[0];
if ( r0.secureConnectionStart ) {