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 reduzir esse problema, o Chrome tem colocado várias restrições nas guias em segundo plano nos últimos anos. Recentemente, fizemos vários esforços para fazer mais melhorias, e este documento oferece 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.

Otimizar um aplicativo para segundo plano

Os desenvolvedores da Web precisam saber que os usuários geralmente têm muitas guias abertas em segundo plano, e isso pode ter um efeito sério no uso de energia e na duração da bateria. O trabalho em segundo plano deve ser mantido no mínimo, a menos que seja absolutamente necessário para oferecer uma experiência de usuário específica. A API Page Visibility precisa ser usada para detectar quando a página está em segundo plano e suspender todo o trabalho desnecessário, 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, 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 temporizadores em lotes uma vez por segundo, garantindo que o número de ativações de processo seja mantido no mínimo. As páginas que tocam áudio audível são consideradas visíveis para o usuário e estão isentas da limitação de timer em segundo plano. A isenção dura vários segundos depois que o áudio é interrompido para permitir que os aplicativos enfileirem a próxima faixa de áudio.

O áudio é considerado audível apenas quando o Chrome mostra o ícone de áudio. Os streams de áudio silenciosos não concedem isenções.

Limitação do timer em segundo plano baseada em orçamento

Envio no Chrome 57, a limitação de timer com base no orçamento é uma extensão do mecanismo de alinhamento de timer, colocando um limite adicional 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 cronômetros em segundo plano.
  • Uma página fica sujeita a limitações de orçamento de tempo após 10 segundos em segundo plano.
  • Uma tarefa de timer só pode ser executada 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 é continuamente renovado ao longo do tempo (atualmente definido como 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á algumas exceções automáticas a 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 tempo de execução de uma vez por segundo ainda é aplicada nesses casos.

Esse mecanismo usa o tempo real, não o tempo da CPU. Essa é uma boa aproximação do tempo de CPU e penaliza o bloqueio da linha de execução principal por longo tempo.

Por fim, lembre-se de que, se você estiver usando tarefas longas em segundo plano, seu aplicativo poderá ser limitado por um período muito longo (até 100 vezes a duração da tarefa). Divida seu 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.

Exclusão

O Chrome fornece a flag --disable-background-timer-throttling para casos de uso como executar conjuntos de testes e outras computações pesadas autorizadas pelo usuário.