背景分頁可能會對瀏覽器效能產生重大負面影響,尤其是電池續航力。為減緩此問題,Chrome 過去幾年來針對背景分頁設有多項限制。近期我們持續努力做出進一步改善,而本文將概略說明 Chrome 政策。本文件著重說明目前 Chrome 57 版的政策,如需長期策略和後續計畫,請參閱這份文件。
針對背景應用程式進行最佳化
網站開發人員應瞭解,使用者經常在背景開啟許多分頁,這可能會對耗電量和電池續航力造成嚴重影響。除非有特定使用者體驗的必要性,否則在背景執行工作時,請盡量減少作業。請使用 PageVisibility API 偵測網頁何時在背景執行,並暫停所有不必要的作業,例如視覺更新。
部分網站的簡易最佳化功能可以最多減少 75% 的 CPU 使用率:
var doVisualUpdates = true;
document.addEventListener('visibilitychange', function(){
doVisualUpdates = !document.hidden;
});
function update() {
if (!doVisualUpdates) {
return;
}
doStuff();
}
政策
requestAnimationFrame()
根據說明文件,當頁面在背景執行時,Chrome 不會呼叫 requestAnimationFrame()
。這項行為從 2011 年就開始實施。
背景計時器對齊方式
從 Chrome 11 開始,每個獨立計時器每秒只能執行一次。Chrome 每秒會分批執行這些計時器,確保程序喚醒次數維持在最低限度。播放有聲音訊的網頁會視為可向使用者顯示,且不受背景計時器節流限制。豁免在音訊停止播放後會持續幾秒鐘,以便應用程式將下一個音軌排入佇列。
請注意,只有 Chrome 顯示音訊圖示時,才會將音訊判定為有聲。 請注意,靜音的音訊串流無法豁免例外狀況。
以預算為基礎的背景計時器節流
Chrome 57 版運送功能:預算式計時器節流是計時器對齊機制的進一步延伸,具有背景計時器 CPU 使用量的額外限制。運作方式如下:
- 每個背景分頁在背景設有執行計時器的時間 (以秒為單位)。
- 背景播放 10 秒後,網頁必須遵守時間預算限制。
- 只有在時間預算不是負數時,系統才會執行計時器工作。
- 計時器執行完畢後,就會從預算中扣除執行時間。
- 預算會持續隨時間重新產生 (目前設定為每秒 0.01 秒)。請注意,Chrome 會收集更多節流行為相關資料,因此調整預算重新產生率。
此節流有許多自動豁免項目:
- 將播放音訊的應用程式視為前景,並未進行節流處理。
- 採用即時連線 (WebSocket 和 WebRTC) 的應用程式,可避免因逾時而關閉這些連線。在這些情況下,系統仍會套用執行時間為一秒的規則。
請注意,這個機制使用的是實際時間,而非 CPU 作業時間。建議您參考 CPU 作業時間,以及長時間封鎖主執行緒的懲處。
最後請注意,如果您在背景使用較長的工作,應用程式可能會長時間執行節流作業 (最多可達工作時間長度的 100 倍)。根據效能指南,將工作分割為不超過 50 毫秒的區塊,並使用 visibilityChange
事件監聽器,避免在背景中執行不必要的工作。
選擇不採用
Chrome 提供 --disable-background-timer-throttling
旗標,用於執行測試套件,以及其他由使用者認可的繁重運算等用途。