##主要监控指标
DNS查询时间——DNS查询的开始到结束所花费的时间;
TCP连接时间——TCP建立连接到连接成功的所花费的时间;
首屏时间——用户浏览器首屏内所有内容都呈现出来所花费的时间;
用户可操作时间(dom Interactive)——用户可以进行正常的点击、输入等操作,默认可以统计domready时间,因为通常会在这时候绑定事件操作;
DOM渲染完成时间——代表DOMContentLoaded事件完成的时间节点,此刻用户可以对页面进行操作,也就是页面中的domready时间;
总下载时间——页面所有资源都加载完成并呈现出来所花的时间,即页面 onload 的时间;
request请求耗时——从服务器端(或缓存、本地资源)响应回的第一个字节和最后一个字节数据所用的时间;
页面重定向时间——如果页面是由redirect而来,则redirectStart和redirectEnd分别代表redirect开始和结束的时间节点;
unload时间——浏览器unload前一个文档的所花费的时间;
##如何统计性能指标的时间
Navigation Timing API 是W3C性能小组引入的新的API,目前IE9以上的浏览器都支持
请求发出的整个过程中,各种环节的时间顺序:
1 | // 获取 performance 数据 |
如何使用
使用 performance.timing 信息简单计算出网页性能数据
1 | // 计算加载时间 |
使用 performance.getEntries() 获取所有资源请求的时间数据
这个函数返回的将是一个数组,包含了页面中所有的 HTTP 请求, HTTP 请求有可能命中本地缓存,所以请求响应的间隔将非常短
1 | var entry = { |
可以像 getPerformanceTiming 获取网页的时间一样,获取某个资源的时间
1 | // 计算加载时间 |
##上报数据
通过图片上报
优点
- 没有跨域问题
- 通过http code来实现成功确认
- 在绝大多数客户端关闭时,可以保证请求被发送出去
缺点
- 只支持GET的方式,数据拼接在URL上,对数据量有限制
- 关闭页面时,发送请求没有被abort时,会导致页面关闭时间变长
- 关闭页面时,发送请求可能被abort
通过Ajax上报
优点
- 可以通过http code 或者 response body 来实现成功确认
- 支持GET和POST,支持大数据量的发送
- 支撑多种数据类型
缺点
- 有跨域问题,需要上报端增加跨域支持
- 在浏览器关闭时,不能保证请求可以被发送出去,可能被abort
Navigator.sendBeacon()
语法:
1 | navigator.sendBeacon(url, data); |
参数:
url
url
参数表明data
将要被发送到的网络地址。data
data
参数是将要发送的ArrayBufferView
或Blob
,DOMString
或者FormData
类型的数据。
描述:
使用户代理在有机会时异步地向服务器发送数据,同时不会延迟页面的卸载或影响下一导航的载入性能。这就解决了提交分析数据时的所有的问题:使它可靠,异步并且不会影响下一页面的加载。此外,代码实际上还要比其他技术简单!该方法发送数据的 HTTP 方法是 POST,可以跨域,类似于表单提交数据。它不能指定回调函数。
1 | window.addEventListener('unload', logData, false); |
兼容性:
简单实现
https://github.com/qinhanwen/performance-api.git
1 | const performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance; |
先打印相关信息看一下,可以参照上面的文档
参考资料
http://cf.meitu.com/confluence/pages/viewpage.action?pageId=80614582