Performance 面板會盡量把瀏覽器運作過程細分為各種 activity,找出真正卡住主執行緒(Main Thread)的那一個就能對症優化。
建構視角的對應章節:執行期偵錯
概覽#
Performance 面板涵蓋的資訊量很大,本章聚焦在「哪個 activity 卡住了主執行緒」的分析方法。
開始之前#
第一次面對密密麻麻的效能報告會無從下手,幾個小技巧可以提升分析效率:
保持環境整潔#
瀏覽器快取與外掛都會干擾測量,每次分析時應使用乾淨環境,例如開無痕視窗、建立新使用者,確保沒有額外套件偷偷執行;也可以用 Network 面板手動清除快取或停用快取。
鎖定目標#
「過早的優化是萬惡的根源。」開發初期難以確認真正瓶頸,動手前先設定明確目標(例如:解決點某按鈕後畫面卡一下的問題),才能讓分析更有方向。錄製過程也應盡量縮短,避免額外點擊或捲動觸發無關 JavaScript。
主執行緒 Main#
當瀏覽器來不及在 16 毫秒內產生下一幀,多半是主執行緒太忙。找出忙碌來源就是分析重點。
點擊 Main 中的任意區塊(activity),或在時間軸上拖曳一段範圍,下方會展開四個分頁:
- Summary:顯示該 activity 的總時間以及內部觸發的子 activity 比例。
- Bottom-Up:將同類 activity 合併。
- Call Tree:以觸發關係由上而下排列,最外層稱為 Root activity。
- Event Log:以時間順序列出 activity。
Bottom-Up#
預設以 Self Time 排序,方便找出總執行時間最長的 activity。例如錄製剛載入時的效能,常會發現 Recalculate Style 因為觸發次數多,加總後超過其他 activity 成為最高項。
Grouping#
在 filter 旁的 Grouping 選單可改變分組方式,例如以 Category 分組會把同色系 activity 視為一組。
Heaviest stack#
右上角可以展開 Heaviest stack,顯示一連串執行時間最長的觸發鏈,與排序最上面的 activity 對應。
Call Tree#
從 Root activity 開始依觸發關係展開,外層 activity 的執行時間是其下所有子 activity 的總和。
預設以 Total Time 排序,可看出耗時最長的 Root activity。例如某次紀錄中最長的 Root activity 可能是某個 Event: dbclick,展開後會看見它觸發的所有後續 activity。
Event Log#
預設以觸發時間排序,左側多了一欄 Start Time。比較特別的是可以同時用執行時間與類型過濾,例如「只顯示執行 15 毫秒以上的 Script」。
搭配 Memory#
面板上方開啟 Memory 後,紀錄會帶上記憶體用量。點擊記憶體圖表上的時間點會自動跳到對應的 activity,方便檢視「用量飆升前發生了什麼」。
Allocation Sampling#
Memory 面板的 Allocation Sampling 紀錄的是 GC 後的結果,因此完整被回收的 function 不會出現;反過來看,能凸顯每個 function 中無法被 GC 的部分。它同樣提供 Chart、Bottom Up、Top Down 三種模式。
Long Task 標記#
Performance 面板會在 Task 上以紅色三角形標記 Long Task,並用紅色斜線標出超過 50 毫秒的部分。為什麼是 50 毫秒可參考 Web Vitals 一章關於 TBT 的說明。
實際範例#
打開示範頁面後按下 GO,等動畫恢復跳動再停止錄製,就能在 Performance 面板看到一連串可分析的 activity,並照前述步驟逐一檢視 Bottom-Up、Call Tree、Event Log。
結語#
把 Performance 面板的資訊一一拆解後,效能分析其實有跡可循。找到可疑的 activity,再對症下藥,比起想到什麼就改什麼有效率得多。
原文出處#
- 原書/iThome:https://ithelp.ithome.com.tw/articles/10250669