Guias em segundo plano no Chrome 57

As guias em segundo plano podem ter um efeito negativo significativo no desempenho do navegador, especialmente na duração da bateria. Para atenuar isso, o Chrome tem colocado várias restrições nas guias em segundo plano nos últimos anos. Recentemente, houve uma série de esforços para fazer outras melhorias, e este documento fornece uma visão geral da política do Chrome. Este documento se concentra na descrição das políticas atuais do Chrome 57. A estratégia de longo prazo e outros planos podem ser encontrados neste documento.

Como otimizar um aplicativo para segundo plano

Os desenvolvedores da Web precisam estar cientes de que os usuários geralmente têm muitas guias abertas em segundo plano, e isso pode ter um efeito sério no uso e na duração da bateria. O trabalho em segundo plano precisa ser o mínimo possível, a menos que seja absolutamente necessário para fornecer uma experiência específica ao usuário. A API de visibilidade da página precisa ser usada para detectar quando a página está em segundo plano e suspender todos os trabalhos desnecessários, como atualizações visuais.

Em alguns sites, essa otimização simples pode reduzir o uso da CPU em até 75%:

var doVisualUpdates = true;

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

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

Políticas

requestAnimationFrame()

De acordo com a documentação (em inglês), o Chrome não chama requestAnimationFrame() quando uma página está em segundo plano. Esse comportamento está em vigor desde 2011.

Alinhamento do timer em segundo plano

Desde o Chrome 11, cada timer independente é executado no máximo uma vez por segundo. O Chrome executa esses timers em lotes uma vez por segundo, garantindo que o número de ativações do processo seja mínimo. As páginas que reproduzem áudio audível são consideradas visíveis para o usuário e estão isentas da limitação do timer em segundo plano. A isenção dura vários segundos após a interrupção do áudio para permitir que os aplicativos enfileirem a próxima faixa de áudio.

O áudio é considerado audível somente quando o Chrome mostra o ícone de áudio. Streams de áudio silencioso não concedem isenções.

Limitação do tempo em segundo plano com base no orçamento

A limitação de timer com base no orçamento é mais uma extensão do mecanismo de alinhamento do timer do Chrome 57. Ela coloca um limite extra no uso da CPU do timer em segundo plano. Ele funciona da seguinte maneira:

  • Cada guia em segundo plano tem um orçamento de tempo (em segundos) para executar timers em segundo plano.
  • Uma página está sujeita a limitações de orçamento de tempo após 10 segundos em segundo plano.
  • Uma tarefa de timer pode ser executada somente quando o orçamento de tempo não é negativo.
  • Depois que um timer é executado, o tempo de execução é subtraído do orçamento.
  • O orçamento é regenerado continuamente com o tempo (atualmente definido para uma taxa de 0,01 segundo por segundo). Essa taxa de nova geração de orçamento pode ser ajustada à medida que o Chrome coleta mais dados sobre o comportamento de limitação.

Há várias isenções automáticas para essa limitação:

  • Os aplicativos que reproduzem áudio são considerados em primeiro plano e não são limitados.
  • Aplicativos com conexões em tempo real (WebSockets e WebRTC), para evitar o fechamento dessas conexões por tempo limite. A regra de timers de execução uma vez por segundo ainda é aplicada nesses casos.

Observe que esse mecanismo usa tempo decorrido, não de CPU. É uma boa aproximação de tempo de CPU e penaliza o bloqueio da linha de execução principal por longo.

Por fim, lembre-se de que, se você estiver usando tarefas longas em segundo plano, o aplicativo poderá ser limitado por um período muito longo (até 100 vezes a duração da tarefa). Divida o trabalho em partes de 50 ms ou menos, de acordo com as diretrizes de desempenho e use o listener visibilityChange para evitar trabalhos desnecessários em segundo plano.

Recusas

O Chrome fornece a sinalização --disable-background-timer-throttling para casos de uso como execução de pacotes de testes e outros cálculos pesados sancionados pelo usuário.