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

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

Как оптимизировать приложение для работы в фоновом режиме

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

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

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 появилась функция ограничения таймеров на основе бюджета, которая дополняет механизм выравнивания таймеров и позволяет дополнительно ограничить использование ЦП фоновыми таймерами. Вот как это работает:

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

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

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

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

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

Отключено

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