Onglets en arrière-plan dans Chrome 57

Les onglets en arrière-plan peuvent avoir un impact négatif considérable sur les performances du navigateur, en particulier sur l'autonomie de la batterie. Pour limiter ce problème, Chrome a mis en place plusieurs restrictions sur les onglets en arrière-plan ces dernières années. Récemment, un certain nombre d'améliorations ont été apportées, et ce document présente la règle Chrome. Ce document décrit les règles actuelles de Chrome 57. Vous trouverez une stratégie à long terme et d'autres plans dans ce document.

Optimiser une application pour l'arrière-plan

Les développeurs Web doivent savoir que les utilisateurs ouvrent souvent de nombreux onglets en arrière-plan, ce qui peut avoir de graves conséquences sur la consommation d'énergie et l'autonomie de la batterie. Le travail en arrière-plan doit être limité au minimum, sauf si cela est absolument nécessaire pour offrir une expérience utilisateur particulière. L'API Page Visibility doit être utilisée pour détecter quand la page est mise en arrière-plan et suspendre toutes les tâches inutiles telles que les mises à jour visuelles.

Pour certains sites, cette simple optimisation peut réduire jusqu'à 75 % l'utilisation du processeur :

var doVisualUpdates = true;

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

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

Règles

requestAnimationFrame()

Conformément à la documentation, Chrome n'appelle pas requestAnimationFrame() lorsqu'une page est exécutée en arrière-plan. Ce comportement est en place depuis 2011.

Alignement du minuteur en arrière-plan

Depuis Chrome 11, chaque minuteur indépendant n'est exécuté qu'une fois par seconde. Chrome exécute ces minuteurs par lots une fois par seconde, ce qui permet de réduire au minimum le nombre de wakeups de processus. Les pages qui lisent un contenu audio audible sont considérées comme visibles par l'utilisateur et sont exemptées de la limitation du minuteur en arrière-plan. Cette exception dure plusieurs secondes après l'arrêt de la lecture du contenu audio pour permettre aux applications de mettre la piste audio suivante en file d'attente.

Notez que l'audio est considéré comme audible quand et seulement quand Chrome affiche l'icône audio. Les flux audio silencieux ne permettent pas d'obtenir des exceptions.

Limitation du minuteur en arrière-plan basé sur le budget

Disponible dans Chrome 57, la limitation du minuteur basée sur le budget est une extension supplémentaire du mécanisme d'alignement du minuteur. Elle place une limite supplémentaire à l'utilisation du processeur des minuteurs en arrière-plan. Elle fonctionne comme suit:

  • Chaque onglet en arrière-plan dispose d'un budget de temps (en secondes) pour exécuter des minuteurs en arrière-plan.
  • Au bout de 10 secondes en arrière-plan, le budget d'une page est limité.
  • Une tâche de minuteur ne peut s'exécuter que lorsque le budget temporel n'est pas négatif.
  • Une fois qu'un minuteur a été exécuté, sa durée d'exécution est soustraite du budget.
  • Le budget est régénéré en continu avec le temps (actuellement défini à une fréquence de 0,01 seconde par seconde). Notez que vous pouvez modifier ce taux de génération de budget à mesure que Chrome collecte plus de données sur le comportement de limitation.

Il existe un certain nombre d'exemptions automatiques de cette limitation:

  • Les applications qui lisent du contenu audio sont considérées comme des applications de premier plan et ne sont pas limitées.
  • Les applications avec des connexions en temps réel (WebSockets et WebRTC) pour éviter de fermer ces connexions par expiration du délai. La règle "runtimers-a-second" (une fois par seconde) est toujours appliquée dans ces cas.

Notez que ce mécanisme utilise la durée d'exécution, et non le temps CPU. Il s'agit d'une bonne approximation du temps CPU et pénalisent le blocage du thread principal pendant une longue période.

Enfin, n'oubliez pas que si vous utilisez des tâches longues en arrière-plan, votre application peut être limitée pendant une très longue période (jusqu'à 100 fois la durée de votre tâche). Divisez votre travail en fragments de 50 ms ou moins conformément aux consignes relatives aux performances et utilisez l'écouteur visibilityChange pour éviter d'effectuer des tâches inutiles en arrière-plan.

Désactivations

Chrome fournit l'indicateur --disable-background-timer-throttling pour les cas d'utilisation tels que l'exécution de suites de tests et d'autres calculs lourds approuvés par l'utilisateur.