网站页面性能(Performance)时间指标参数

前两天做了个培训,见识了公司自己的GA系统(学名叫“网站数据监控平台”),会上几个大牛争论了半天页面性能的时间参数问题,作为一个菜鸟在下面听的云里雾里,现在抽空查查文档资料,学习一下,做个笔记。

首先我们要了解一个API,即Performance API,它的performance.timing对象算是实现整个性能监控系统的基础,网上一搜,阮大神已经有文章介绍了,我就引用一下Performance的参数解释:

performance.timing对象包含以下属性(全部为只读):

  • navigationStart:当前浏览器窗口的前一个网页关闭,发生unload事件时的Unix毫秒时间戳。如果没有前一个网页,则等于fetchStart属性。

  • unloadEventStart:如果前一个网页与当前网页属于同一个域名,则返回前一个网页的unload事件发生时的Unix毫秒时间戳。如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为0。

  • unloadEventEnd:如果前一个网页与当前网页属于同一个域名,则返回前一个网页unload事件的回调函数结束时的Unix毫秒时间戳。如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为0。

  • redirectStart:返回第一个HTTP跳转开始时的Unix毫秒时间戳。如果没有跳转,或者不是同一个域名内部的跳转,则返回值为0。

  • redirectEnd:返回最后一个HTTP跳转结束时(即跳转回应的最后一个字节接受完成时)的Unix毫秒时间戳。如果没有跳转,或者不是同一个域名内部的跳转,则返回值为0。

  • fetchStart:返回浏览器准备使用HTTP请求读取文档时的Unix毫秒时间戳。该事件在网页查询本地缓存之前发生。

  • domainLookupStart:返回域名查询开始时的Unix毫秒时间戳。如果使用持久连接,或者信息是从本地缓存获取的,则返回值等同于fetchStart属性的值。

  • domainLookupEnd:返回域名查询结束时的Unix毫秒时间戳。如果使用持久连接,或者信息是从本地缓存获取的,则返回值等同于fetchStart属性的值。

  • connectStart:返回HTTP请求开始向服务器发送时的Unix毫秒时间戳。如果使用持久连接(persistent connection),则返回值等同于fetchStart属性的值。

  • connectEnd:返回浏览器与服务器之间的连接建立时的Unix毫秒时间戳。如果建立的是持久连接,则返回值等同于fetchStart属性的值。连接建立指的是所有握手和认证过程全部结束。

  • secureConnectionStart:返回浏览器与服务器开始安全链接的握手时的Unix毫秒时间戳。如果当前网页不要求安全连接,则返回0。

  • requestStart:返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的Unix毫秒时间戳。

  • responseStart:返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳。

  • responseEnd:返回浏览器从服务器收到(或从本地缓存读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的Unix毫秒时间戳。

  • domLoading:返回当前网页DOM结构开始解析时(即Document.readyState属性变为“loading”、相应的readystatechange事件触发时)的Unix毫秒时间戳。

  • domInteractive:返回当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的Unix毫秒时间戳。

  • domContentLoadedEventStart:返回当前网页DOMContentLoaded事件发生时(即DOM结构解析完毕、所有脚本开始运行时)的Unix毫秒时间戳。

  • domContentLoadedEventEnd:返回当前网页所有需要执行的脚本执行完成时的Unix毫秒时间戳。

  • domComplete:返回当前网页DOM结构生成时(即Document.readyState属性变为“complete”,以及相应的readystatechange事件发生时)的Unix毫秒时间戳。

  • loadEventStart:返回当前网页load事件的回调函数开始时的Unix毫秒时间戳。如果该事件还没有发生,返回0。

  • loadEventEnd:返回当前网页load事件的回调函数运行结束时的Unix毫秒时间戳。如果该事件还没有发生,返回0。

得到了上述的所有时间点后,我们再来看下面这张图(来自W3C),

根据这张图我们基本上就能得到网页的各个时间线了,最后再列举几个比较重要的时间线并做说明:

  • DNS: 从域名解析开始至解析完成的时间 (domainLookupEnd - domainLookupStart)

  • Connect: 从域名解析完成至服务器建立连接完成的时间 (connectEnd - connectStart)

  • Request: 从向服务请求开始至浏览器拿到服务器第一个响应字节的时间 (responseStart - requestStart)

  • Response: 从浏览器拿到服务器第一个字节至最后一个响应字节的时间 (responseEnd - responseStart)

  • Domready: 从发出请求到页面DOM解析完毕,不包括图片的加载 (domComplete - domainLookupStart)

  • Onload: 当页面解析/DOM树建立完成,并完成了诸如图片、脚本、样式表甚至是iframe中所有资源的下载完成。从发出请求到页面完全加载完毕(不包含Ajax时间)(筛选栏显示数据) (loadEventEnd - domainLookupStart)

另附chrome开发者工具对timeline的解释:https://developer.chrome.com/devtools/docs/network#resource-network-timing

如有不正确的地方欢迎指正!

参考:
http://www.w3.org/TR/navigation-timing/#sec-navigation-timing-interface
http://javascript.ruanyifeng.com/bom/performance.html
http://www.sitepoint.com/profiling-page-loads-with-the-navigation-timing-api/
http://calendar.perfplanet.com/2011/a-practical-guide-to-the-navigation-timing-api/