利用window.performance查看网页性能javascript
通常咱们能够经过浏览器的调试工具-网络面板,或者代理工具查看网页加载过程当中的各个阶段的耗时。而利用window.performance属性则能够得到更为精确的原始数据,以毫秒为单位,精确到微秒。css
performance.timing属性介绍html
图片说明以下:前端
属性说明:java
前端性能统计的数据大体有如下几个:chrome
一、DNS寻址时间:t.domainLookupEnd - t.domainLookupStart。浏览器
优化方法:检查页面是否添加了DNS预解析代码。缓存
DNS Prefetch 是一种DNS 预解析技术,当你浏览网页时,浏览器会在加载网页时对网页中的域名进行解析缓存,这样在你单击当前网页中的链接时就无需进行DNS的解析,减小用户等待时间,提升用户体验。目前支持 DNS Prefetch 的浏览器有 google chrome 和 firefox 3.5。若是要控制浏览器端是否对域名进行预解析,能够经过Http header 的x-dns-prefetch-control 属性进行控制。服务器
<link rel="dns-prefetch" href="//haitao.nosdn1.127.net">
是否合理利用域名发散与域名收敛的策略网络
二、TCP链接耗时:t.connectEnd - t.connectStart
三、首包时间: t.responseStart - t.navigationStart
优化方法:是否加cdn,数据能否静态化等
四、request请求耗时:t.responseEnd - t.requestStart
优化方法:返回内容是否已经压缩过,静态资源是否打包好等。
五、白屏时间 domLoading - fetchStart
白屏时间节点指的是从用户进入网站(输入url、刷新、跳转等方式)的时刻开始计算,一直到页面有内容展现出来的时间节点。这个过程包括dns查询、创建tcp链接、发送首个http请求(若是使用https还要介入TLS的验证时间)、返回html文档、html文档head解析完毕。
使用注入代码监控没法获取解析html文档以前的时间信息,目前广泛使用的白屏时间统计方案是在html文档的head中全部的静态资源以及内嵌脚本/样式以前记录一个时间点,在head最底部记录另外一个时间点,二者的差值做为白屏时间。
<html> <head> <meta charset="UTF-8"/> <!--这里还有一大串meta信息--> <script> var start_time = new Date();//统计起点,实际为html开始解析的时间节点 </script> <link href='a.css'></link> <script src='a.js'></script> <script> var end_time = new Date();//统计起点,实际为html开始解析的时间节点 </script> </head> <body> </body> </html>
上述代码中的end_time
和start_time
的差值通常做为白屏时间的估值,但理论上来说,这个差值只是浏览器解析html文档head的时间,并不是准确的白屏时间。
六、解析DOM树结构的时间:t.domComplete - t.domLoading
优化方法:检查dom节点是否过多,dom是否嵌套过深
七、页面加载完成的时间:t.loadEventEnd - t.fetchStart
首屏时间的统计比较复杂,目前应用比较广的方案是将首屏的图片、iframe等资源添加onload事件,获取最慢的一个。这种方案比较适合首屏元素数量固定的页面。
优化方法:考虑延迟加载,懒加载,部分加载,减小首屏渲染时间
performance.getEntries():每一个资源请求的时间数据。
performance.now() 计算网页从performance.timing.navigationStart到当前时间的毫秒数。
精确计算某个操做,或某个方法执行的耗时。
var start = performance.now(); dosomething(); var end = performance.now(); var time = end - start; console.log('耗时' + time + '毫秒。');
performance.mark()给相应的视点作标记。结合performance.measure()使用也能够算出各个时间段的耗时。
执行下列代码能够查看页面加载各个阶段的耗时。
function getTimes(){ var t = performance.timing; var timing = { domainLookupTime: t.domainLookupEnd - t.domainLookupStart, TCPConnectTime: t.connectEnd - t.connectStart, ttfb: t.responseStart - t.navigationStart, requestTime: t.responseEnd - t.requestStart, waitTime: t.domLoading - t.navigationStart, renderDomTime: t.domComplete - t.domLoading, loadPageTime: t.loadEventEnd - t.fetchStart } console.log(timing); } getTimes();