深入理解前端性能监控
页面的性能问题是前端开发中一个重要环节,但一直以来我们没有比较好的手段,来检测页面的性能。比如,为了得到脚本运行的准确耗时,需要一个高精度时间戳。传统的做法是使用Date
对象的getTime
方法。
var start = new Date().getTime();
// do something here
var now = new Date().getTime();
var latency = now - start;
console.log("任务运行时间:" + latency);
上面这种做法有两个不足之处。首先,getTime
方法(以及Date
对象的其他方法)都只能精确到毫秒级别(一秒的千分之一),想要得到更小的时间差别就无能为力了;其次,这种写法只能获取代码运行过程中的时间进度,无法知道一些后台事件的时间进度,比如浏览器用了多少时间从服务器加载网页。
为了解决这两个不足之处,ECMAScript 5
引入“高精度时间戳”这个API,部署在performance
对象上。它的精度可以达到1毫秒的千分之一(1秒的百万分之一),这对于衡量的程序的细微差别,提高程序运行速度很有好处,而且还可以获取后台事件的时间进度。
目前,所有主要浏览器都已经支持performance
对象,包括Chrome 20+、Firefox 15+、IE 10+、Opera 15+。你可以通过以下方法来探测和兼容performance
:
var performance = window.performance ||
window.msPerformance ||
window.webkitPerformance;
if (performance) {
// 你的代码
}
performance的结构:
performance.memory
是显示此刻内存占用情况,它是一个动态值,其中:
usedJSHeapSize
表示:JS 对象(包括V8引擎内部对象)占用的内存数totalJSHeapSize
表示:可使用的内存jsHeapSizeLimit表示
:内存大小限制
通常,usedJSHeapSize
不能大于totalJSHeapSize
,如果大于,有可能出现了内存泄漏。
performance.navigation
显示页面的来源信息,其中:
redirectCount
表示:如果有重定向的话,页面通过几次重定向跳转而来,默认为0type
表示页面打开的方式,- 0 表示
TYPE_NAVIGATENEXT
正常进入的页面(非刷新、非重定向等) - 1 表示
TYPE_RELOAD
通过window.location.reload()
刷新的页面 - 2 表示
TYPE_BACK_FORWARD
通过浏览器的前进后退按钮进入的页面(历史记录) - 255 表示
TYPE_UNDEFINED
非以上方式进入的页面
- 0 表示
performance.onresourcetimingbufferfull
属性是一个在resourcetimingbufferfull
事件触发时会被调用的 event handler
。它的值是一个手动设置的回调函数,这个回调函数会在浏览器的资源时间性能缓冲区满时执行。
performance.timeOrigin
是一系列时间点的基准点,精确到万分之一毫秒。
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。
这些参数非常有用,可以帮助我们获取页面的Domready
时间、onload
时间、白屏时间等,以及单个页面资源在从发送请求到获取到rsponse
各阶段的性能参数。
对我们比较有用的页面性能数据大概包括如下几个,这些参数是通过上面的performance.timing
各个属性的差值组成的,它是精确到毫秒的一个值,计算方法如下:
- 重定向耗时:
redirectEnd - redirectStart
- DNS查询耗时 :
domainLookupEnd - domainLookupStart
- TCP链接耗时 :
connectEnd - connectStart
- HTTP请求耗时 :
responseEnd - responseStart
- 解析dom树耗时 :
domComplete - domInteractive
- 白屏时间 :
responseStart - navigationStart
- DOMready时间 :
domContentLoadedEventEnd - navigationStart
- onload时间:
loadEventEnd - navigationStart
,也即是onload
回调函数执行的时间。
好好学习,天天来逛
好久没有更新劲爆文章了!!!
叨叨大湿啥时候换主题了
一早就换typecho了。
大神能否换一个友链?已添加贵站。
名称:DEFCON笔记
地址:https://defcon.cn/
描述:DEFCON笔记-不仅关注WordPress,还关注科技与生活。
已经添加上了
叨叨大神,能否首页友链哈?