performance是W3C基于前端对性能的需求下推出的一套性能API标准,这套API的目的是简化开发者对网站性能进行精确分析与控制过程,当然对于测试开发来说,也可以利用这套API开发自己的框架来得到前端性能参数。
一、前端知识
要学习这套API的使用,先简单介绍下前端的基础知识。
1.页面加载
一个页面的请求到响应再到显示出来,需要经过下面一些重要过程,当我们在浏览器输入一个URL或者说点击一个URL开始,会出现如下流程:
(1)页面准备
(2)重定向:在header定义了重定向才会有这个过程,如果没有重定向,不会产生这个过程。
(3)app cache:会先检查这个域名是否有缓存,如果有缓存就不需要DNS解析域名。这里的app是值应用程序application,不指手机app。
(4)DNS解析:把域名解析成IP,如果直接用ip地址访问,不产生这个过程。
(5)TCP连接:http协议是经过TCP来传输的,所以产生一个http请求就会有TCP connect,但是依赖于长连接,不会产生这个过程。
(6)request header:请求头信息。
(7)request body:请求体信息,比如get请求是没有请求体信息的,所以没有这个过程,这就是为什么把头跟体分开写的原因。
(8)response header:响应头信息。
(9)response body:响应体信息。
(10)解析HTML结构
(11)加载外部脚本和样式表文件:正常来说JS、css都是外部加载的,当然有不正常的人啊,比如我。
(12)解析并执行脚本代码
(13)构建与解析HTML DOM树:这个过程可以去了解下DOM树是怎样的就明白啦。
(14)加载外部图片
(15)页面加载完成,显示出来啦。
说实话,一个页面加载要这么多流程,它不觉得累,我觉得好累啊。
2.重定向分析
为什么单独说一下这个重定向呢?因为刚开始我也想不通为什么重定向放在最开始,因为是否重定向是在request header中定义的啊,但是接着DNS、TCP连接,不应该是先DNS、TCP连接、request header再重定向吗?答案是的,来看看下面流程:
(1)app cach
(2)DNS解析
(3)TCP连接
(4)request header
(5)重定向
(6)app cach
(7)DNS解析
(8)TCP连接
(9)request header
从上面就可以看出来,实际上面15个步骤我是把重定向的过程没有写的那么细啦,而实际重定向本身就是要经过DNS、TCP连接、request header再重定向的。所以说一般
有重定向的请求耗时会多一些。
二、performance
说完了前端的东西,这下轮到说正题啦,开始介绍到performance提供了一套API,下面就从API介绍开始吧。
1.performance.timing
这个API能帮我们得到整个页面请求的时间,如下图,在Chrome的Console是可以直接运行的
先解释下这些时间都是代表什么
timing 对象里边的数据比较多,梳理如下几个关键性的节点:
再来一张图,表示各阶段的开始与结束对应的时间
从以上的分析,我们就可以得到一些时间的计算,一个个来吧。
(1)准备新页面耗时:fetchStart - navigationStart
(2)重定向时间:redirectEnd - redirectStart
(3)App Cache时间:domainLookupStart - fetchStart
(4)DNS解析时间:domainLookupEnd -domainLookupStart
(5)TCP连接时间:connectEnd - connectStart
(6)request时间:responseEnd - requestStart 这个计算是代表请求响应加起来的时间
(7)请求完毕到DOM树加载:domInteractive -responseEnd
(8)构建与解析DOM树,加载资源时间:domCompleter -domInteractive
(9)load时间:loadEventEnd - loadEventStart
(10)整个页面加载时间:loadEventEnd -navigationStart
(11)白屏时间:responseStart-navigationStart
2.performance.getEntries()
这个API能帮我们获得资源的请求时间,包括JS、CSS、图片等。
如上图可以看到这个API请求返回的是一个数组,这个数组包括整个页面所有的资源加载,上图打开了一个其中一个资源,可以看到如下信息:
(1)entryType:类型为resource
(2)name:资源的url
(3)initiatorType:资源是link
(4)资源时间:duration的值,是responseEnd - startTime得到的
3.performance.memory
这个API主要是得到浏览器内存情况:
(1)jsHeapSizeLimit:内存大小限制
(2)totalJSHeapSize:可使用的内容
(3)userdJSHeapSize:已使用的内容
userdJSHeapSize表示所有被使用的JS堆栈内存,totalJSHeapSize可使用的JS堆栈内存,如果userdJSHeapSize的值大于totalJSHeapSize,就可能出现内存泄漏。
参考文章:
http://www.tuicool.com/articles/ymQbMr
http://www.tuicool.com/articles/uyE7Bvf
http://www.xuanfengge.com/html5-performance-front-end-load-performance-of.html
http://shuizhongyue.blog.51cto.com/7439523/1718327