利用 Chrome Dev Tools 進(jìn)行頁(yè)面性能分析的步驟說(shuō)明(前端性能優(yōu)化)
背景
我們經(jīng)常使用 Chrome Dev Tools 來(lái)開發(fā)調(diào)試,但是很少知道怎么利用它來(lái)分析頁(yè)面性能,這篇文章,我將詳細(xì)說(shuō)明怎樣利用 Chrome Dev Tools 進(jìn)行頁(yè)面性能分析及性能報(bào)告數(shù)據(jù)如何解讀。
分析面板介紹
上圖是 Chrome Dev Tools 的一個(gè)截圖,其中,我認(rèn)為能用于進(jìn)行頁(yè)面性能快速分析的主要是圖中圈出來(lái)的幾個(gè)模塊功能,這里簡(jiǎn)單介紹一下:
- Network : 頁(yè)面中各種資源請(qǐng)求的情況,這里能看到資源的名稱、狀態(tài)、使用的協(xié)議(http1/http2/quic...)、資源類型、資源大小、資源時(shí)間線等情況
- Performance : 頁(yè)面各項(xiàng)性能指標(biāo)的火焰圖,這里能看到白屏?xí)r間、FPS、資源加載時(shí)間線、longtask、內(nèi)存變化曲線等等信息
- Memory : 可以記錄某個(gè)時(shí)刻的頁(yè)面內(nèi)存情況,一般用于分析內(nèi)存泄露
- JavaScript Profiler : 可以記錄函數(shù)的耗時(shí)情況,方便找出耗時(shí)較多的函數(shù)
- Layers : 展示頁(yè)面中的分層情況
分析步驟說(shuō)明
首先,我們?cè)诜治龅臅r(shí)候,建議使用隱身模式打開頁(yè)面,排除一些插件等因素對(duì)頁(yè)面性能情況的影響。然后,我們把頁(yè)面緩存勾選去掉,要測(cè) disable cache 的情況,再把網(wǎng)絡(luò)情況調(diào)整一下,我們用電腦打開頁(yè)面的時(shí)候一般都連著 wifi 等,要更真實(shí)一些去測(cè)頁(yè)面的性能,還是把網(wǎng)絡(luò)調(diào)到 3G 等情況比較好,如圖:
調(diào)整好之后,我們切到 Performance 面板,這里先說(shuō)明一下一些按鈕的作用:
上圖,從左到右分別代表的是:
- 手動(dòng)開始記錄,開始后需要手動(dòng)結(jié)束
- 自動(dòng)重啟頁(yè)面,并記錄整個(gè)頁(yè)面加載的過(guò)程。這個(gè)是最常用的,一般大概分析頁(yè)面性能的時(shí)候都是點(diǎn)這個(gè)就夠了
- 清除性能錄制的記錄
- 上傳頁(yè)面性能錄制的數(shù)據(jù)
- 下載頁(yè)面性能錄制的數(shù)據(jù)
- 選擇要展示的性能記錄。你可能進(jìn)行了多次分析,這里可以切換去看每次的結(jié)果
- 是否捕捉頁(yè)面加載過(guò)程的截圖,這個(gè)一般都要勾選
- 是否記錄內(nèi)存變化,這個(gè)一般都要勾選
- 垃圾回收,點(diǎn)擊了即進(jìn)行一次垃圾回收
這里,我以京東的一個(gè)頁(yè)面為例,勾選 disable cache,網(wǎng)絡(luò)情況為 Fast 3G,來(lái)說(shuō)明一下,應(yīng)該如何理解性能結(jié)果,找出優(yōu)化點(diǎn)。
從網(wǎng)絡(luò)面板分析
我們來(lái)看看網(wǎng)絡(luò)面板,看看都有哪些信息。如下圖所示:
從圖中可以看出,頁(yè)面中有的一些性能優(yōu)化手段有:
- 頁(yè)面直出,輸入
https://wq.jd.com/wxportal/index_v6
,頁(yè)面加載回來(lái)的 document 就是一個(gè)渲染好的 html 頁(yè)面 - 圖片優(yōu)化,部署在不同的CDN域名下,用webp/dpg等格式圖片,圖片切割等
- http 協(xié)議有部分采用 http2,多路復(fù)用,加快資源加載
- 小 logo 使用base42來(lái)處理
- 按需加載,菜單先加載第一屏的圖標(biāo),滑動(dòng)到第二屏?xí)r再加載第二屏的圖標(biāo)
而從圖片,個(gè)人認(rèn)為,還可以考慮用上的一些性能優(yōu)化手段有:
- html 的大小為138kb,Content Download的時(shí)間為七百多毫秒,感覺(jué)可以拆分一下頁(yè)面,非一二屏的內(nèi)容分開加載。
- TTFB(Time To First Byte)為五百多毫秒,在下載第一個(gè)字節(jié)之前等待的時(shí)間過(guò)久,不過(guò)這里主要是用戶網(wǎng)絡(luò)情況影響,可以做的比較少。如DNS解析優(yōu)化,減少后端服務(wù)處理時(shí)間等
- 合并雪碧圖,大輪播圖下面的菜單分類那里的圖標(biāo),可以用一張雪碧圖來(lái)集合這些圖標(biāo)
- 頂部輪播圖,在首次加載時(shí),可以先加載第一幀的圖片,后面幾幀延后一下
- 圖片較多,可以的話,都用 http2 協(xié)議
從性能面板分析
切到 Performance 面板,點(diǎn)擊自動(dòng)重啟頁(yè)面,并記錄整個(gè)頁(yè)面加載的過(guò)程,然后來(lái)分析結(jié)果~
網(wǎng)絡(luò)&&白屏
性能面板,有很多很多的參數(shù),我們要看一些比較常見的。首先看白屏?xí)r間和網(wǎng)絡(luò)加載情況,如下圖:
上圖,我們可以看幾點(diǎn)信息:
- 本次頁(yè)面加載的白屏?xí)r間約為 1000 ms
- FPS 曲線沒(méi)有標(biāo)紅,如果有很多標(biāo)紅的則說(shuō)明頁(yè)面存在渲染卡頓多的地方
- 從網(wǎng)絡(luò)資源加載情況來(lái)看,圖片沒(méi)有啟用 http2,因此每次可以同時(shí)加載的圖片數(shù)有限,未被加載的圖片有等待過(guò)程
- 資源的加載時(shí)間也可以看到,比如輪播的背景圖加載了近 700 毫秒,時(shí)間有點(diǎn)長(zhǎng)
另外,我們可以看一下資源加載有沒(méi)有空白期,雖然上圖沒(méi)有,但是如果資源加載之間存在空白期,說(shuō)明沒(méi)有充分利用資源加載的空閑時(shí)間,可以調(diào)整一下。
火焰圖
火焰圖,主要在 Main 面板中,是我們分析具體函數(shù)耗時(shí)最??吹拿姘澹覀儊?lái)看一下,如圖:
首先,面板中會(huì)有很多的 Task,如果是耗時(shí)長(zhǎng)的 Task,其右上角會(huì)標(biāo)紅(圖中沒(méi)有,說(shuō)明頁(yè)面首屏的邏輯處理分配得還不錯(cuò)),這個(gè)時(shí)候,我們可以選中標(biāo)紅的 Task (這里就隨手選中一個(gè)),然后放大(選中,滑動(dòng)鼠標(biāo)可放大),看其具體的耗時(shí)點(diǎn)。
放大后,這里可以看到都在做哪些操作,哪些函數(shù)耗時(shí)了多少,這里代碼有壓縮,看到的是壓縮后的函數(shù)名。然后我們點(diǎn)擊一下某個(gè)函數(shù),在面板最下面,就會(huì)出現(xiàn)代碼的信息,是哪個(gè)函數(shù),耗時(shí)多少,在哪個(gè)文件上的第幾行等。這樣我們就很方便地定位到耗時(shí)函數(shù)了。
還可以橫向切換 tab ,看它的調(diào)用棧等情況,更方便地找到對(duì)應(yīng)代碼。具體大家可以試試~
時(shí)間線&&內(nèi)存情況
在 Timings 的區(qū)域,我們可以看到本次加載的一些關(guān)鍵時(shí)間,分別有:
- FCP: First Contentful Paint
- LCP: Largest Contentful Paint
- FMP: First Meaningful Paint
- DCL: DOMContentLoaded Event
- L: Onload Event
我們可以選區(qū)(選擇從白屏到有內(nèi)容的區(qū)域,代表本次的頁(yè)面加載過(guò)程),可以對(duì)照著看一下上面的時(shí)間,截圖如下:
另外,我們可以看到頁(yè)面中的內(nèi)存使用的情況,比如 JS Heap(堆),如果曲線一直在增長(zhǎng),則說(shuō)明存在內(nèi)存泄露,從圖中可以看出,相當(dāng)長(zhǎng)的一段時(shí)間,內(nèi)存曲線都是沒(méi)有下降的,這里是有發(fā)生內(nèi)存泄露的可能的,在 Onload 之后,內(nèi)存才得到釋放。更多內(nèi)存泄露產(chǎn)生的原因及分析方法,可以參照我的這篇文章《Chrome 瀏覽器垃圾回收機(jī)制與內(nèi)存泄漏分析》
最下方就是頁(yè)面的一個(gè)整理耗時(shí)概況,如果 Scripting 時(shí)間過(guò)長(zhǎng),則說(shuō)明 js執(zhí)行的邏輯太多,可以考慮優(yōu)化js,如果渲染時(shí)間過(guò)長(zhǎng),則考慮優(yōu)化渲染過(guò)程,如果空閑時(shí)間過(guò)多,則可以考慮充分利用起來(lái),比如把一些上報(bào)操作放到頁(yè)面空閑時(shí)間再上報(bào)等。
其他面板
以上就是性能面板可以看的一些信息。另外,我們可以借助 Layers面板來(lái)查看頁(yè)面分層情況的3D視圖,Rendering面板(點(diǎn)擊more tools->Rendering即可打開),勾選Layer Bordersk可以看到復(fù)合層、RenderLayer區(qū)域,可以幫助分析動(dòng)畫卡頓、是否開啟GPU加速等問(wèn)題,而 Memory 面板 和 JavaScript Profiler 面板主要是分析內(nèi)存泄露的,這里就不說(shuō)了,可以看我另一篇文章《Chrome 瀏覽器垃圾回收機(jī)制與內(nèi)存泄漏分析》
用Audits工具分析
Audits 其實(shí)就是 LightHouse,LightHouse 是Google開源的一個(gè)自動(dòng)化測(cè)試工具,它通過(guò)一系列的規(guī)則來(lái)對(duì)網(wǎng)頁(yè)進(jìn)行評(píng)估分析,最終給出一份評(píng)估報(bào)告。它的面板是這樣的:
整體情況
Audits主要從5個(gè)方面來(lái)給網(wǎng)頁(yè)打分,當(dāng)然你也可以去掉某些方面的評(píng)估。在選擇了設(shè)備、評(píng)估方面、網(wǎng)絡(luò)情況等選項(xiàng)后,點(diǎn)擊 Run Audits ,我們將會(huì)得到一份報(bào)告。
上圖是一個(gè)總體報(bào)告,可以看出,這個(gè)頁(yè)面的性能不太合格。當(dāng)然一次的測(cè)試也說(shuō)明不了什么問(wèn)題,只能做個(gè)參考。我們看它的性能指標(biāo)分別有:
- First Contentful Paint:內(nèi)容首次開始繪制。
- First Meaningful Paint:可以簡(jiǎn)單理解為用戶看到網(wǎng)頁(yè)主要內(nèi)容的時(shí)間,分?jǐn)?shù)越低,頁(yè)面顯示其主要內(nèi)容的速度就越快。圖中例子,網(wǎng)頁(yè)首次有效繪制時(shí)間為2.5s。
- Speed Index:速度指標(biāo)是一個(gè)頁(yè)面加載性能指標(biāo),向你展示明顯填充頁(yè)面內(nèi)容的速度,此指標(biāo)的分?jǐn)?shù)越低越好。
- First CPU Idle:首次 CPU 空閑時(shí)間
- Time to Interactive:可互動(dòng)時(shí)間,頁(yè)面中的大多數(shù)網(wǎng)絡(luò)資源完成加載并且CPU在很長(zhǎng)一段時(shí)間都很空閑的所需的時(shí)間。此時(shí)可以預(yù)期cpu非??臻e,可以及時(shí)的處理用戶的交互操作。
- Max Potential First Input Delay:最大的輸入延遲時(shí)間,輸入響應(yīng)能力對(duì)用戶如何看待你應(yīng)用的性能起著關(guān)鍵作用。應(yīng)用有 100 毫秒的時(shí)間響應(yīng)用戶輸入。如果超過(guò)此時(shí)間,用戶就會(huì)認(rèn)為應(yīng)用反應(yīng)遲緩。
這些時(shí)間,都可以點(diǎn)擊圖中紅框切換展示方式,會(huì)附上對(duì)應(yīng)的時(shí)間解釋,然后可以點(diǎn)擊 Learn more 來(lái)查看詳細(xì)的指標(biāo)介紹。在文檔中,每一項(xiàng)指標(biāo)都會(huì)明確的分為三個(gè)部分:為什么說(shuō)此審查非常重要;如何通過(guò)此審查;如何實(shí)現(xiàn)此審查;
性能指標(biāo)優(yōu)化建議解讀
性能建議主要分為3類, Opportunities 可優(yōu)化項(xiàng)、手動(dòng)診斷項(xiàng)、通過(guò)的審查項(xiàng)。本次的例子如下圖:
圖中的每一項(xiàng)都可以展開來(lái)看明細(xì)解釋,其中:
可優(yōu)化項(xiàng)有2個(gè)建議:
- 延遲會(huì)阻塞渲染的資源加載,這里是一個(gè) navfoot.6bf68af7.css
- 延遲視口外的圖片加載,這里列舉了不必要加載的圖片(和我上文提的優(yōu)化建議一致,哈哈)
這項(xiàng)里面的內(nèi)容指的是LightHouse發(fā)現(xiàn)的一些可以直接優(yōu)化的點(diǎn),你可以對(duì)應(yīng)這些點(diǎn)來(lái)進(jìn)行優(yōu)化。
手動(dòng)診斷項(xiàng)有6個(gè)建議:
- 最小化主線程工作
- 減少JavaScript執(zhí)行時(shí)間
- 避免DOM太大
- 通過(guò)有效的緩存策略緩存一些靜態(tài)資源
- 避免鏈接關(guān)鍵請(qǐng)求
- 保持低請(qǐng)求數(shù)量和小傳輸大小
這些項(xiàng)目表示LightHouse并不能替你決定當(dāng)前是好是壞,但是把詳情列出來(lái),由你手動(dòng)排查每個(gè)項(xiàng)目的情況
通過(guò)的審查項(xiàng)
這里列出的都是做的好的地方,本文例子共有16條,不過(guò)即使做的好,依然值得我們進(jìn)去仔細(xì)看一下,因?yàn)橄袼袟l目一樣,這里的每個(gè)條目也有一個(gè)showmore,我們可以點(diǎn)進(jìn)去仔細(xì)學(xué)習(xí)背后的知識(shí)和原理!
Accessibility輔助功能
輔助功能指的是那些可能超出"普通"用戶范圍之外的用戶的體驗(yàn),他們以不同于你期望的方式訪問(wèn)你的網(wǎng)頁(yè)或進(jìn)行交互,本文的例子建議如下圖:
輔助功能類別測(cè)試屏幕閱讀器的能力和其他輔助技術(shù)是否能在頁(yè)面中正常工作。例如:按元素來(lái)使用屬性,標(biāo)簽使用是否規(guī)范,img 標(biāo)簽是否缺少 alt 屬性,可辨別的元素命名等等。這一項(xiàng)我們不展開講,但是還是建議大家按照審計(jì)建議修改一下網(wǎng)頁(yè)。
其他幾項(xiàng),本文的例子最佳實(shí)踐評(píng)分挺高的,而例子不支持PWA,也不需要考慮SEO,這里就不展開說(shuō)明了,有對(duì)應(yīng)需求的可以自己詳細(xì)看看即可。
總結(jié)
最后總結(jié)一下,我們利用Chrome Dev Tools 進(jìn)行頁(yè)面性能分析有以下指標(biāo)可以參考:
- 從網(wǎng)絡(luò)面板分析
- 從性能面板分析
- 從Memory面板等分析內(nèi)存泄露
- 用Audits工具分析
而這些分析方法,本文都詳細(xì)寫了??梢哉J(rèn)真看看~
到此這篇關(guān)于利用 Chrome Dev Tools 進(jìn)行頁(yè)面性能分析的步驟說(shuō)明(前端性能優(yōu)化)的文章就介紹到這了,更多相關(guān) Chrome Dev Tools 頁(yè)面性能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Chrome插件(擴(kuò)展)開發(fā)全攻略(完整demo)
- 10 款珍藏已久的 Chrome 瀏覽器插件(程序員必裝)
- chrome開發(fā)者助手插件v2.10發(fā)布提升開發(fā)效率不再只是口號(hào)
- 解決selenium+Headless Chrome實(shí)現(xiàn)不彈出瀏覽器自動(dòng)化登錄的問(wèn)題
- Selenium執(zhí)行完畢未關(guān)閉chromedriver/geckodriver進(jìn)程的解決辦法(java版+python版)
- 利用Postman和Chrome的開發(fā)者功能探究項(xiàng)目(畢業(yè)設(shè)計(jì)項(xiàng)目)
- vue開發(fā)chrome插件,實(shí)現(xiàn)獲取界面數(shù)據(jù)和保存到數(shù)據(jù)庫(kù)功能
- 使用Python解析Chrome瀏覽器書簽的示例
- 怎樣制作“別人家的”Chrome插件
相關(guān)文章
js實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)且?guī)шP(guān)閉功能的圖片廣告實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)且?guī)шP(guān)閉功能的圖片廣告,實(shí)例分析了javascript操作鼠標(biāo)事件及html元素的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02cocos2dx骨骼動(dòng)畫Armature源碼剖析(二)
本篇主要給大家介紹cocos2dx骨骼動(dòng)畫Armature源碼剖析之flash中數(shù)據(jù)與xml中數(shù)據(jù)關(guān)系,需要的朋友一起來(lái)學(xué)習(xí)吧2015-09-09Javascript查看大圖功能代碼實(shí)現(xiàn)
這篇文章主要介紹了Javascript查看大圖功能代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖
這篇文章主要為大家詳細(xì)介紹了微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08JavaScript中的二進(jìn)制數(shù)據(jù)處理方法詳解
Blob、ArrayBuffer和Buffer是JavaScript中用于表示和操作二進(jìn)制數(shù)據(jù)的三種主要方式,本文將深入探討這些概念,以及它們?nèi)绾卧贘avaScript中使用,需要的可以參考一下2023-06-06