使用Timeline作性能分析css
Timeline面板記錄和分析了web應用運行時的全部活動狀況,這是研究和查找性能問題的最佳途徑。
###Timeline面板概覽 Timeline面板主要有三個部分構成:頂部的概述部分、記錄視圖和工具欄。
html
在記錄期間,每一個事件以「瀑布」的形式記錄在記錄視圖中。記錄類型有如下四種:加載、腳本執行、渲染和繪製。這些記錄以顏色區分,以下:
以chrome加載一個html頁面的記錄爲例。第一條記錄(發送請求)是來自chrome的獲取頁面的HTTP請求,緊接着是一條接收響應的記錄(獲取響應的HTTP響應)、一些接收數據的記錄(來自頁面的數據),而後是完成加載的記錄。Timeline的一個完整的時間記錄和描述參考Timeline事件參考。
當你把鼠標懸停在Timeline的一條記錄上時,彈出框顯示關聯事件的詳細信息。好比下面的截圖展現加載一張圖片資源的細節。Timeline事件參考解釋了適用於每個記錄類型的詳細狀況。
在記錄試圖除了詳情,你能夠在如下三種模式下檢查記錄:git
#####事件模式 事件模式提供以類型組織的記錄期間捕獲的全部事件的概覽。大體能看出你的應用在什麼類型的任務上的主要的時間消耗。這個視圖中的水平條的長度對應於事件完成花費的時間長度。
當你在事件視圖選擇一個時間段(參考在Timeline上放大某個事件段),記錄視圖只展現對應時間段的記錄。
github
#####幀模式 幀模式提供洞察應用的渲染性能的能力。一「幀」表明瀏覽器渲染一幀要顯示的內容必需要作的工做--運行JavaScript、處理事件、更新DOM、改變樣式佈局和繪製頁面。你的應用的目標是運行在每秒60幀下,對應於大多數(但不是所有)視頻顯示器的60Hz的刷新速率。所以,你的應用程序有大約16.6毫秒(1000毫秒/60)對每一幀作準備。web
貫穿幀視圖的水平線呈現60FPS和30FPS的幀速率目標。幀的高度對應於該幀渲染所花費的時間。每幀填充的顏色代表了每種類型的任務所花費的時間百分比。算法
渲染每幀花費的時間顯示在記錄試圖的頂部。若是你把鼠標懸停在顯示時間上,會顯示幀的附屬信息,包括每種類型的任務的時間、CPU時間、計算FPS的時間。
參考定位強制同步佈局的示例。chrome
######關於透明或淺灰色的幀 也許你已經注意到有些區域的幀是淺灰色的或者透明的(空的)。這些區域分別代表:json
######關於綠色條 繪圖是一個兩步的過程,包括:繪製調用和柵格化。瀏覽器
二者都被繪製,它們只是表明工做的不一樣子任務。若是你有性能問題你看查找你正在改變什麼屬性。而後,查看是否有一個合成器,只有這樣才能達到一樣的目的。CSS觸發器能夠幫助明確一個解決方案。
######查看幀率統計 被選中的幀範圍的平均幀率和標準誤差顯示在Timeline面板的底部。若是你把鼠標懸停在平均幀速率上,彈窗框會顯示該幀的如下信息:
#####內存模式 內存視圖展現你的應用的隨着時間內存使用狀況,包括文檔數、DOM節點數,以及在內存內的事件監聽(未被GC的)。
內存視圖沒法直接告訴你哪裏引發了內存泄露,但能夠幫助你識別你的應用裏的什麼事件可能致使內存泄露。你能夠接着使用Heap Profiler來識別出致使內存泄露的代碼。
#####記錄 啓動記錄會話,訪問你的應用,再中止記錄,以此來獲取一段記錄。 It helps to know in advance the kind of activity you want to record — for example, page loading, scrolling performance of a list of images, and so forth, and then stick to that script.
爲了更好的記錄:
1.打開你要記錄的頁面。
2.打開Timeline面板,使用下面的按鈕來開始記錄:
點擊Timeline面板的這個圓形按鈕:
使用快捷鍵Ctrl+E, Mac上是Cmd+E。
在記錄期間,記錄按鈕會變成:
3.在頁面上執行你指望記錄的活動。
4.按下頁面上當前是紅色的記錄按鈕或使用快捷鍵來中止記錄。
######記錄頁面加載 一個常見的任務是來自網絡初始化的頁面加載,鍵盤快捷鍵在這種場景下頗有用,讓你能快速的啓動記錄、從新加載頁面、中止記錄。
記錄一個頁面加載:
1.在一個新的tab頁或者窗口中打開web頁面。
2.打開Timeline面板按下Cmd+E(Mac)或者Ctrl+E(Windows/Linux)來開始記錄。
3.快速按下Cmd+R或者Ctrl+R來從新加載頁面。
4.頁面加載完中止記錄。(參考記錄)
你會獲得相似如下的頁面,第一條記錄(發送HTTP請求)是chrome爲獲取頁面的HTTP請求,緊接着是獲取HTTP相應相關的記錄,接着是一條或者多條接收數據的記錄、完成加載的記錄、解析HTML的記錄。
參考Timeline事件參考瞭解詳細的記錄類型。
######更好獲取記錄的小技巧 這是一些更好獲取記錄的小技巧
###分析Tineline面板裏的記錄 這部分是分析Timeline面板裏的記錄的一些小貼士。
#####查看記錄詳情 當你選中Timeline面板裏的一條記錄,詳情面板裏會展現該事件相關的詳細信息。
有些細節在全部類型的事件中多呈現,好比持續時間和CPU計算時間。關於每種類型事件的詳細信息,參考Timeline事件參考。
當你選擇一條繪製記錄,DevTools高亮了藍色半透明的矩形更新,以下圖所示畫面的區域。
#####DOMContentLoaded and Load event markers The Timeline annotates each recording with a blue and a red line that indicate, respectively, when the DOMContentLoaded and load events were dispatched by the browser. Timeline面板以藍線和紅線標註瀏覽器發出DOMContentLoaded事件和load事件。DOMContentLoaded事件在頁面的元素加載和解析完被觸發,load事件在文檔的全部資源(圖片、CSS文件等)所有加載好時觸發一次。
#####定位強制同步佈局 佈局是Chrome計算頁面上全部元素的位置、大小的處理過程。一般Chrome在響應中「懶」處理應用中的CSS規則應用或者DOM更新。Chrome在攢一批樣式和佈局修改而不是每當有變化時就去處理。固然應用程序能夠經過查詢特定佈局相關的元素屬性,如element.offsetWidth的值強制Chrome去當即執行佈局。因此這被稱爲「強制同步佈局」,並在頻繁執行或者在一棵大的DOM樹上執行時有可能帶來大的性能瓶頸。
Timeline面板會以一個黃色歎號()標識出應用中的強制同步佈局,選中這條記錄,詳情面板包含響應的調用堆棧。
若是一條記錄中包含的子記錄中有強制佈局,父記錄會被標識稍微暗一點的黃色歎號。展開父記錄能定位到引發強制佈局的子記錄。
參考定位強制同步佈局樣例來參考檢測和修復這類性能問題。
#####關於嵌套事件 Timeline裏的事件有時是嵌套在父事件的下方的。你能夠展開父事件查看嵌套的子事件。有兩個緣由致使Timeline裏有嵌套事件:
下面的截圖是一個嵌套同步事件的示例。在這個例子中,Chrome正在解析一些HTML時發現須要一些外部資源被加載。這些請求在解析完成前發出來,因此發送請求時間做爲解析HTML的子事件被顯示出來。
#####給Timeline裏的嵌套事件着色 Timeline條按照如下着色:
#####過濾和搜索記錄 你能夠按照事件類型去過濾展現哪些記錄(好比只展現加載事件),或只展現大於等於1毫秒或者15毫秒的記錄。你也能夠過濾匹配某個字符串的記錄。
當查看全部事件時,你可能想找某一條記錄,可是它被淹沒在衆多記錄中。這種狀況你能夠不使用過濾功能。按下Ctr+F(Window/Linux)或者Cmd+F(Mac),此時Timeline中已經對角到包含搜索項的記錄。
#####在Timeline上放大某個事件段 爲了更好的分析記錄,你能夠放大Timeline的某一段概覽,以減小記錄試圖中相應的時間刻度。
放大時間段,能夠按照如下作法:
這是更過的關於Timeline時間段的小貼士:
#####保存和加載記錄 你能夠以json文件保存Timeline記錄,後面能夠在Timeline中再打開。
######保存Timeline記錄 1.在Timeline中右鍵或者按住Ctrl再單擊鼠標左鍵(Mac中),選擇保存Timeline數據菜單或者在鍵盤上使用Ctrl+S。
2.選擇一段時間段來點擊保存。
######打開Timeline記錄 1.右鍵或者按住Ctrl再單擊鼠標左鍵選擇加載要加載的Timeline數據,或者使用Ctrl+O鍵盤快捷鍵。
2.定位到json文件,選中並打開。
#####用戶產生的Timeline事件 應用能夠添加它們的事件到Timeline記錄中。你可使用console.timeStamp()方法添加一個原子事件到記錄中,或者使用console.time()和console.timeEnd()來標記處代碼執行的時間範圍。好比下圖中console.timeStamp()被用來顯示"Adding result"事件。參考在Using the Console中使用Marking the Timeline來獲取更多信息。
#####記錄中的CPU計算時間 你會看到上面出如今Timeline記錄的淺灰色條,表示CPU忙。鼠標懸停在在一個CPU條會高亮處Timeline部分在此期間,CPU是活動的(以下圖所示)。一個CPU條的長度一般是Timeline中的它下面全部的(高亮)事件的總和。若是二者不匹配,這多是因爲如下之一:
###Timeline事件參考 本節列出並說明了各個類型的記錄類型,和它們的屬性。
#####Common event properties 某些詳情存在於全部類型的事件,而有些只適用於某些事件類型。本節列出了常見的不一樣事件類型的屬性。下面的參考中將列出特定於某些事件類型的屬性。
事件彙總
對於有嵌套事件的事件,每一層目錄所花費的時間。
調用堆棧
對於有子事件的事件,每一層目錄所花費的時間。
CPU計算時間
事件記錄所消耗的CPU計算時間。
詳情
事件的其餘詳情。
持續時間(時間戳)
事件和它的子事件完成所消耗的時間;時間戳是相對於記錄開始事件發生的時間。
自身時間
不包括任何子事件的事件自身消耗的時間。
堆空間使用大小
事件記錄期間應用佔用的內存大小,和取樣期間堆空間使用的變化。
#####Loading事件
事件 | 描述 |
---|---|
解析HTML | Chrome執行HTML解析算法 |
完成加載 | 一個網絡請求完成 |
接收數據 | 請求的數據被接收,這會是一個或多個的接收數據事件 |
接收響應 | 來自請求的最初的HTTP響應 |
發送請求 | 一個已發送的網絡請求 |
#####Loading事件屬性 資源
請求資源的URL。
預覽
請求資源的預覽(僅支持圖片)。
請求方法
請求的HTTP方法(GET或POST等等)。
狀態碼
HTTP響應狀態碼。
MIME類型
請求的資源的MIME類型。
數據大小
請求的資源的字節數。
#####Scripting事件 這一節介紹Scripting類別的事件和它們的屬性。
事件 | 描述 |
---|---|
動畫幀觸發 | 一個預約的動畫幀被觸發,它的回調處理程序被調用。 |
取消動畫幀 | 一個動畫幀被取消。 |
GC事件 | 垃圾回收發生。 |
DOM內容加載 | DOM內容加載被瀏覽器觸發。這個事件在全部的頁面DOM元素加載和解析完被觸發。 |
腳本執行 | 一段腳本被執行。 |
事件 | 一個JavaScript事件("鼠標按下",或按鍵事件等)。 |
函數調用 | 調用一個頂層的JavaScript函數(僅出如今當瀏覽器進入JavaScript引擎)。 |
設置定時器 | 一個定時器以setInterval()或者setTimeout()建立。 |
請求動畫幀 | 調用requestAnimationFrame()函數來調度新的幀。 |
移除定時器 | 將以前建立的定時器清除。 |
開始計時 | 調用console.time()函數。 |
計時結束 | 調用console.timeEnd()函數。 |
定時任務觸發 | 一個以setInterval()或者setTimeout()調度的定時器被觸發。 |
XHR狀態改變 | XMLHTTPRequest狀態改變。 |
XHR加載 | XMLHTTPRequest完成加載。 |
#####Scripting事件屬性
Timer ID
定時器ID.
Timeout
定時器指定的超時時間。
Repeats
定時器是否循環的標識。
Function Call
被調用的函數。
#####Rendering事件 這一節列出渲染時間和它們的屬性。
事件 | 描述 |
---|---|
無效佈局 | 變化的DOM的佈局無效 |
佈局 | 頁面執行佈局 |
從新計算樣式 | Chrome從新計算元素樣式 |
滾動 | 嵌套視圖的內容被滾動 |
#####Rendering事件屬性
Layout invalidated
致使無效佈局的代碼堆棧。
Nodes that need layout
從新佈局前須要佈局的節點數。這一般是由開發者的代碼無效致使的。
Layout tree size
根佈局(Chrome開始佈局的節點)下節點總數。
Layout scope
可能的值是「部分」(從新佈局的邊界是DOM的一部分)或者整個文檔。
Elements affected 從新計算樣式,受影響的元素數量。 recalculation. Styles invalidated 從新計算樣式時,致使無效樣式的代碼堆棧。
#####Painting事件 這一節介紹Painting事件和它們的屬性。
事件 | 描述 |
---|---|
Composite Layers | Chrome的渲染引擎合成圖像層。 |
Image Decode | 圖像解碼。 |
Image Resize | 圖像還原爲原始大小。 |
Paint | 複合層繪製到顯示器的一個區域。鼠標懸停在在一條Paint紀錄頁面上會高亮顯示更新的區域。 |
#####Painting事件屬性 Location繪製的矩形的x和y座標。Dimensions繪製區域的高度和寬度。