- 前端性能统计的指标有哪些?
- 白屏时间:从打开网站到有内容渲染出来的时间节点;
- 首屏时间:首屏内容渲染完毕的时间节点;
- 用户可操作时间节点:domready触发节点;
- 总下载时间:window.onload的触发节点。
- 如何统计前端的性能(量化统计)?
下面介绍几种以上几个数据的统计方案。
2.1 常规统计方案
使用注入代码监控的方式统计以上指标,在没有一些浏览器新API(如下文将提到的timing API)的支持下,得到的数据大都是估值,虽然不准确,但也有一定的参考价值。
2.1.1 白屏时间
白屏时间节点指的是从用户进入网站(输入url、刷新、跳转等方式)的时刻开始计算,一直到页面有内容展示出来的时间节点。这个过程包括dns查询、建立tcp连接、发送首个http请求(如果使用https还要介入TLS的验证时间)、返回html文档、html文档head解析完毕。
使用注入代码监控无法获取解析html文档之前的时间信息,目前普遍使用的白屏时间统计方案是在html文档的head中所有的静态资源以及内嵌脚本/样式之前记录一个时间点,在head最底部记录另一个时间点,两者的差值作为白屏时间。如下:
上述代码中的end_time和start_time的差值一般作为白屏时间的估值,但理论上来讲,这个差值只是浏览器解析html文档head的时间,并非准确的白屏时间。
2.1.2 首屏时间
首屏时间的统计比较复杂,目前应用比较广的方案是将首屏的图片、iframe等资源添加onload事件,获取最慢的一个。
这种方案比较适合首屏元素数量固定的页面,比如移动端首屏不论屏幕大小都展示相同数量的内容,响应式得改变内容的字体、尺寸等。但是对于首屏元素不固定的页面,这种方案并不适用,最典型的就是PC端页面,不同屏幕尺寸下展示的首屏内容不同。上述方案便不适用于此场景。
2.1.3 可操作时间
用户可操作的时间节点即dom ready触发的时间,使用jquery可以通过$(document).ready()获取此数据,如果不使用jQuery可以参考这里通过原生方法实现dom ready。
2.1.4 总下载时间
Note
总下载时间即window.onload触发的时间节点。
目前大多数web产品都有异步加载的内容,比如图片的lazyload等。如果总下载时间需要统计到这些数据,可以借鉴AOP的理念,在请求异步内容之前和之后分别打点,最后计算差值。不过通常来讲,我们说的总下载时间并不包括异步加载的内容。
2.2 使用window.performance API
Note
window.performance 是W3C性能小组引入的新的API,目前IE9以上的浏览器都支持。
一个performance对象的完整结构包括:
type 返回值应该是0,1,2 中的一个。分别对应三个枚举值:
○ 0 : TYPE_NAVIGATE (用户通过常规导航方式访问页面,比如点一个链接,或者一般的get方式)
○ 1 : TYPE_RELOAD (用户通过刷新,包括JS调用刷新接口等方式访问页面)
○ 2 : TYPE_BACK_FORWARD (用户通过后退按钮访问本页面) 最重要的是timing字段的统计数据,它包含了网络、解析等一系列的时间数据。
2.2.1 timing API
timing的整体结构包括:
startTime:有些浏览器实现为navigationStart,代表浏览器开始unload前一个页面文档的开始时间节点。比如我们当前正在浏览baidu.com,在地址栏输入google.com并回车,浏览器的执行动作依次为:unload当前文档(即baidu.com)->请求下一文档(即google.com)。navigationStart的值便是触发unload当前文档的时间节点。
○ 如果当前文档为空,则navigationStart的值等于fetchStart。
2.2.2 计算性能指标
Note
可以使用Navigation.timing 统计到的时间数据来计算一些页面性能指标,比如DNS查询耗时、白屏时间、domready等等。
● DNS查询耗时 = domainLookupEnd - domainLookupStart
● TCP链接耗时 = connectEnd - connectStart
● request请求耗时 = responseEnd - responseStart
● 解析dom树耗时 = domComplete - domInteractive
● 白屏时间 = domloadng - fetchStart
● domready时间 = domContentLoadedEventEnd - fetchStart
● onload时间 = loadEventEnd - fetchStart