初探 performance – 監控網頁與程式效能

發表於2015-09-04

使用 window.performance 提供了一組精確的資料,經過簡單的計算就能得出一些網頁效能資料。

配合上報一些客戶端瀏覽器的裝置型別等資料,就可以實現簡單的統計啦!

額,先看下相容性如何:http://caniuse.com/#feat=nav-timing

這篇文章中 Demo 的執行環境為最新的 Chrome 的控制檯,如果你用的是其他瀏覽器,自查相容性哈~

先來看看在 Chrome 瀏覽器控制檯中執行 window.performance 會出現什麼:

簡單解釋下 performance 中的屬性:

先看下一個請求發出的整個過程中,各種環節的時間順序:

具體的含義都在註釋裡說明了,接下來我們看下能用這些資料做什麼?

使用 performance.timing 資訊簡單計算出網頁效能資料

在註釋中,我用【重要】標註了我個人認為比較有用的資料,用【原因】標註了為啥要重點關注這個資料

 使用performance.getEntries() 獲取所有資源請求的時間資料

這個函式返回的將是一個陣列,包含了頁面中所有的 HTTP 請求,這裡拿第一個請求 window.performance.getEntries()[0] 舉例。 注意 HTTP 請求有可能命中本地快取,所以請求響應的間隔將非常短 可以看到,與 performance.timing 對比: 沒有與 DOM 相關的屬性:

  • navigationStart
  • unloadEventStart
  • unloadEventEnd
  • domLoading
  • domInteractive
  • domContentLoadedEventStart
  • domContentLoadedEventEnd
  • domComplete
  • loadEventStart
  • loadEventEnd

新增屬性:

  • name
  • entryType
  • initiatorType
  • duration

與 window.performance.timing 中包含的屬性就不再介紹了:

可以像 getPerformanceTiming 獲取網頁的時間一樣,獲取某個資源的時間:

 使用 performance.now() 精確計算程式執行時間

performance.now() 與 Date.now() 不同的是,返回了以微秒(百萬分之一秒)為單位的時間,更加精準。

並且與 Date.now() 會受系統程式執行阻塞的影響不同,performance.now() 的時間是以恆定速率遞增的,不受系統時間的影響(系統時間可被人為或軟體調整)。

注意 Date.now() 輸出的是 UNIX 時間,即距離 1970 的時間,而 performance.now() 輸出的是相對於 performance.timing.navigationStart(頁面初始化) 的時間。

使用 Date.now() 的差值並非絕對精確,因為計算時間時受系統限制(可能阻塞)。但使用 performance.now() 的差值,並不影響我們計算程式執行的精確時間。

 使用 performance.mark() 也可以精確計算程式執行時間

使用 performance.mark() 標記各種時間戳(就像在地圖上打點),儲存為各種測量值(測量地圖上的點之間的距離),便可以批量地分析這些資料了。

直接上示例程式碼看註釋便明白:

 

可以看到,for 迴圈 measureRandomFunc888 的時候

結束時間為: 4875.1199999969685

開始時間為:4875.112999987323

執行時間為:4875.1199999969685 – 4875.112999987323 = 0.00700000964

標記和測量用完了可以清除掉:

當然 performance.mark() 只是提供了一些簡便的測量方式,比如之前我們測量 domReady 是這麼測的:

其實就可以寫成:

拋磚引玉:performance 資料能幹啥用?

熟悉 Chrome 開發者工具的朋友應該知道:在開發環境下,其實我們自己開啟 Chrome 的開發者工具,切換到網路皮膚,就能很詳細的看到網頁效能相關的資料。但當我們需要統計分析使用者開啟我們網頁時的效能如何時,我們將 performance 原始資訊或通過簡單計算後的資訊(如上面寫到的 getPerformanceTiming() 和 getEntryTiming()) 上傳到伺服器,配合其他資訊(如 HTTP 請求頭資訊),就完美啦~

相關文章