利用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();