Tabbladen op de achtergrond in Chrome 57

Tabbladen op de achtergrond kunnen een grote negatieve invloed hebben op de browserprestaties, vooral op de batterijduur. Chrome heeft daarom de afgelopen jaren verschillende beperkingen voor achtergrondtabbladen ingesteld. Er zijn onlangs een aantal pogingen gedaan om verdere verbeteringen aan te brengen en dit document geeft een overzicht van het Chrome-beleid. In dit document worden de huidige beleidsregels in Chrome 57 beschreven. In dit document vind je de langetermijnstrategie en verdere plannen.

Een app optimaliseren voor de achtergrond

Webontwikkelaars moeten er rekening mee houden dat gebruikers vaak veel tabbladen op de achtergrond hebben geopend. Dit kan een ernstig effect hebben op het energieverbruik en de batterijduur. Werk op de achtergrond moet tot een minimum worden beperkt, tenzij het absoluut noodzakelijk is om een bepaalde gebruikerservaring te bieden. Gebruik de API voor paginazichtbaarheid om te detecteren wanneer de pagina op de achtergrond wordt geplaatst en alle onnodige werkzaamheden, zoals visuele updates, op te schorten.

Voor sommige sites kan deze eenvoudige optimalisatie het CPU-gebruik met wel 75% verminderen:

var doVisualUpdates = true;

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

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

Beleid

requestAnimationFrame()

Volgens de documentatie roept Chrome requestAnimationFrame() niet aan als een pagina op de achtergrond staat. Dit gedrag is sinds 2011 van kracht.

Uitlijning van achtergrondtimers

Sinds Chrome 11 wordt elke onafhankelijke timer maximaal één keer per seconde uitgevoerd. Chrome voert deze timers één keer per seconde in batches uit, zodat het aantal procesactiveringen tot een minimum wordt beperkt. Pagina's die hoorbare audio afspelen, worden beschouwd als zichtbaar voor de gebruiker en zijn vrijgesteld van throttling van achtergrondtimers. De vrijstelling duurt een paar seconden nadat de audio is gestopt met afspelen, zodat apps het volgende audiotrack in de wachtrij kunnen zetten.

Audio wordt alleen als hoorbaar beschouwd als Chrome het audio-icoon toont. Stille audiostreams geven geen vrijstelling.

Throttling van achtergrondtimers op basis van budget

Verzending in Chrome 57, budgetgebaseerde timer-throttling is een verdere uitbreiding van het timeruitlijningsmechanisme, waarbij een extra limiet wordt geplaatst voor het CPU-gebruik van timers op de achtergrond. Zo werkt het:

  • Elk tabblad op de achtergrond heeft een tijdbudget (in seconden) om timers op de achtergrond uit te voeren.
  • Een pagina wordt na 10 seconden op de achtergrond onderworpen aan beperkingen van het tijdsbudget.
  • Een timertaak mag alleen worden uitgevoerd als het tijdbudget niet-negatief is.
  • Nadat een timer is uitgevoerd, wordt de uitvoeringstijd afgetrokken van het budget.
  • Het budget wordt in de loop van de tijd voortdurend aangevuld (op dit moment ingesteld op een snelheid van 0,01 seconden per seconde). Deze regeneratiesnelheid van het budget kan worden aangepast als Chrome meer gegevens over het gedrag van de beperking verzamelt.

Er zijn een aantal automatische uitzonderingen op deze beperking:

  • Apps die audio afspelen, worden beschouwd als voorgrond-apps en worden niet beperkt.
  • Apps met realtime verbindingen (WebSockets en WebRTC) om te voorkomen dat deze verbindingen worden gesloten vanwege een time-out. De regel run-timers-once-a-second wordt in deze gevallen nog steeds toegepast.

Dit mechanisme gebruikt de kloktijd, niet de CPU-tijd. Het is een goede schatting van de CPU-tijd en straft het langdurig blokkeren van de primaire thread af.

Vergeet niet dat als je lange taken op de achtergrond gebruikt, je app voor een lange periode kan worden beperkt (tot 100 keer de duur van je taak). Verdeel je werk in blokken van 50 ms of minder per de prestatierichtlijnen en gebruik de visibilityChange-listener om onnodig werk op de achtergrond te voorkomen.

Afmeldingen

Chrome biedt de --disable-background-timer-throttling-flag voor use cases zoals testpakketten uitvoeren en andere zware berekeningen die door de gebruiker zijn goedgekeurd.