Фоновые вкладки в Chrome 57

Фоновые вкладки могут оказать существенное негативное влияние на производительность браузера, особенно на время автономной работы. Чтобы смягчить это, Chrome в течение последних нескольких лет накладывал различные ограничения на фоновые вкладки. В последнее время был предпринят ряд попыток внести дальнейшие улучшения, и в этом документе представлен обзор политики Chrome. В этом документе основное внимание уделяется описанию текущих политик в Chrome 57. Долгосрочную стратегию и дальнейшие планы можно найти в этом документе .

Оптимизация приложения для фона

Веб-разработчикам следует помнить, что у пользователей часто в фоновом режиме открыто множество вкладок, и это может серьезно повлиять на энергопотребление и срок службы батареи. Работа в фоновом режиме должна быть сведена к минимуму, за исключением случаев, когда это абсолютно необходимо для обеспечения определенного взаимодействия с пользователем. API видимости страницы следует использовать для определения того, когда страница находится в фоновом режиме, и приостановить всю ненужную работу, например визуальные обновления.

Для некоторых сайтов эта простая оптимизация может снизить загрузку ЦП на целых 75 %:

var doVisualUpdates = true;

document.addEventListener('visibilitychange', function(){
    doVisualUpdates = !document.hidden;
});

function update() {
    if (!doVisualUpdates) {
    return;
    }
    doStuff();
}

Политика

запросАнимацияФрейм()

Согласно документации , Chrome не вызывает requestAnimationFrame() , когда страница находится в фоновом режиме. Такое поведение существует с 2011 года.

Выравнивание фонового таймера

Начиная с Chrome 11 , каждый независимый таймер запускается не чаще одного раза в секунду. Chrome запускает эти таймеры пакетно раз в секунду, гарантируя, что количество пробуждений процессов сведено к минимуму. Страницы, воспроизводящие звуковой сигнал, считаются видимыми для пользователя и на них не распространяется фоновое регулирование таймера. Исключение длится несколько секунд после прекращения воспроизведения звука, чтобы приложения могли поставить в очередь следующую звуковую дорожку.

Обратите внимание, что звук считается слышимым тогда и только тогда, когда Chrome показывает значок звука. Тихие аудиопотоки не допускают исключений.

Регулирование фонового таймера на основе бюджета

В Chrome 57 регулирование таймера на основе бюджета является дальнейшим расширением механизма выравнивания таймера, накладывая дополнительное ограничение на использование ЦП фоновым таймером. Он действует следующим образом:

  • Каждая фоновая вкладка имеет бюджет времени (в секундах) для запуска таймеров в фоновом режиме.
  • На страницу распространяются ограничения по бюджету времени после 10 секунд работы в фоновом режиме.
  • Задачу таймера можно запускать только в том случае, если бюджет времени неотрицательен.
  • После выполнения таймера время его работы вычитается из бюджета.
  • Бюджет постоянно обновляется со временем (в настоящее время установлено значение 0,01 секунды в секунду). Обратите внимание, что эту скорость регенерации бюджета можно изменить, поскольку Chrome собирает больше данных о поведении регулирования.

Существует ряд автоматических исключений из этого регулирования:

  • Приложения, воспроизводящие звук, считаются приоритетными и не регулируются.
  • Приложения с соединениями в реальном времени (WebSockets и WebRTC), чтобы избежать закрытия этих соединений по тайм-ауту. В этих случаях по-прежнему применяется правило запуска таймеров один раз в секунду.

Обратите внимание, что этот механизм использует время стены, а не время процессора. Это хорошее приближение к процессорному времени, которое наказывает за блокировку основного потока на длительное время.

Наконец, помните, что если вы используете длительные задачи в фоновом режиме, ваше приложение может быть ограничено на очень длительный период времени (до 100 раз превышающий продолжительность вашей задачи). Разделите свою работу на куски по 50 мс или меньше в соответствии с рекомендациями по производительности и используйте прослушиватель visibilityChange , чтобы избежать выполнения ненужной работы в фоновом режиме.

Отказ от участия

Chrome предоставляет флаг --disable-background-timer-throttling для таких случаев использования, как запуск наборов тестов и другие тяжелые вычисления, санкционированные пользователем.