Chrome 57 的背景分頁

背景分頁可能會對瀏覽器效能造成嚴重負面影響,尤其是對電池續航力。為避免這種情況發生,Chrome 過去幾年一直對背景分頁設下各種限制。我們最近已採取多項措施進一步改善,本文件將概略說明 Chrome 政策。本文件主要說明 Chrome 57 中的現行政策。如需長期策略和其他計畫,請參閱這份文件

將應用程式設為背景執行最佳化

網頁開發人員應瞭解,使用者經常在背景開啟許多分頁,這可能會對耗電量和電池續航力產生嚴重影響。除非為了提供特定使用者體驗,否則應盡量減少背景工作。您應使用 Page Visibility 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 收集到更多調節行為相關資料時,您就可以調整預算重新產生率。

系統會自動豁免以下幾種情況:

  • 播放音訊的應用程式會視為前景,因此不會受到頻寬限制。
  • 具有即時連線 (WebSockets 和 WebRTC) 的應用程式,可避免因逾時而關閉這些連線。在這些情況下,系統仍會套用每秒執行一次計時器的規則。

請注意,這個機制會使用實際時間,而非 CPU 時間。這可有效估算 CPU 時間,並會針對長時間阻斷主執行緒的行為加以懲罰。

最後,請注意,如果您在背景使用長時間工作,應用程式可能會受到長時間節流 (可達工作時間長度的 100 倍)。依據效能規範,將工作分割成 50 毫秒以下的區塊,並使用 visibilityChange 事件監聽器,避免在背景執行不必要的工作。

選擇不採用

Chrome 會提供 --disable-background-timer-throttling 旗標,用於執行測試套件和其他經使用者認可的大量運算等用途。