主要是爲了確保有一個乾淨的測試環境, 不被其它因素所影響.javascript
谷歌性能測試地址 googlechrome.github.io/devtools-sa…html
國內性能測試地址: gitee.com/hellojamesz…vue
能夠看到以下畫面:java
能夠看到頁面藍色小方塊在運動git
有些用戶電腦的CPU性能很好, 可能沒法較好的分析問題(難以發現低端配置設備的性能問題), 因此須要降速.github
在Chrome瀏覽器控制檯中找到"Performance" => "CPU"選項, 選擇下降4/6倍性能web
上面已經限制了CPU的性能, 接下來須要尋找性能瓶頸了.chrome
屢次點擊"Add 10", 向頁面中添加小塊, 直到感受頁面上小塊運動時出現明顯卡頓便可.瀏覽器
此時, 已經能夠明顯感受到頁面很卡頓了.性能優化
經過點擊"Optimize"按鈕, 能夠提早感覺下優化先後的效果對比
能夠明顯感覺到優化先後頁面的流暢度明顯不同.
如何分析問題, 確定是要依賴數據, 這裏須要使用到Chrome的Performance功能.
將頁面切換至非優化的狀態, 點擊"Record".
錄製的結果以下圖所示:
以上數據初學者可能看不明白, 不要緊, 咱們來一步步瞭解各部分的含義
fps, 指頁面每秒幀數
fps < 24
會讓用戶感受到卡頓, 由於人眼的識別主要是24幀圖中藍色標記出的區域, 即FPS記錄的信息 放大某一區域, 能夠看到, FPS由兩部分組成:
切換至已優化狀態, 再進行錄製後, 獲得FPS數據以下:
能夠看出:
上圖中FPS下的位置, 即CPU信息 咱們採集些一個真實業務的CPU數據, 這裏我抓取的是我的簡書的performance, 以下圖所示:
對比能夠發現, CPU數據的一些特性:
NET部分能夠將屏幕逐幀錄製下來, 能幫忙觀察頁面的狀態, 分析首屏渲染速度
Frames部分, 主要用於查看特定幀的FPS, 能夠查看特定的幀狀況, 懸停其上, 能夠查看數據.
能夠看到:
點擊某個Frames塊, 能夠查看到更加詳細的數據
點擊某個Frames塊, 能夠查看到更加詳細的數據
在Chrome中, 還有一個More Tools選項, 選中"Rendering"選項
接着, 開啓"FPS meter"選項
勾選後, 在頁面上會出現一個FPS統計器, 如上圖左上角.
暫時先不勾選"FPS meter", 不利於系統性學習
經過前面的內容, 咱們已經知道頁面有性能問題, 那接下來就要開始尋找緣由了.
對性能進行錄製完成時, 會默認在底部顯示一個 Summary摘要, 顯示全局信息.
上面展現了0~4.90s錄製時間的具體耗時:
主要了解這3個耗時, 但瞭解這3個耗時, 對於哪有問題, 還須要進一步的排查.
上圖紅色框出部分, 就是Main, 其中每一塊是每一幀中所作的事情
目前仍看不出什麼. 爲了方便觀看, 咱們可在fps, cpu, net模塊, 點擊一下, 縮小時間區間:
如上圖所示, 經過縮小時間區間, 來實現放大Main中的內容. 如今已經可以看到, Main中展現的"火焰圖", 即函數調用的堆棧. 其中:
上圖中, 能夠看到Animation Frame Fired右上角有一個紅色三角號, 這是Chrome自動幫助識別出有問題的部分, 就像FPS中的紅色同樣, 用來識別問題
上圖能夠到提示"Warning: Recurring handler took 318.21 ms", 即重複處理程序耗時318.21ms
點擊Animation Frame Fired下面的"Function Call"
如上圖, 能夠看到函數調用代碼中的位置, 能夠點擊進行查看:
雖然定位到了, 是方法 update形成的問題, 但不夠明確, 因此須要進一步探索.
能夠看到, 每一個紫色條都有一個紅色的小三角, 前面提到"紅色三角是Chrome幫助自動識別有問題的地方", 查看提示信息: "Forced reflow is a likely performance bottleneck.", 即強制迴流多是性能瓶頸
點擊查看摘要.
能夠看到, 問題定位在了 performanceTest.html的第136行, 點擊查看, 可以看到是對每個元素進行樣式修改.
這段代碼的問題在於, 在每一個動畫幀中, 它會更改每一個方塊的樣式, 而後查詢頁面上每一個方塊的位置. 因爲樣式發生了變化, 瀏覽器不知道每一個方塊的位置是否發生了變化, 所以必須從新佈局方塊以計算其位置.
避免這種狀況的出現, 能夠參考: 避免大型、複雜的佈局和佈局抖動
能夠看到, 優化後的狀態, script, render的時間都大大減小了, 所以fps明顯提升.