Schede in background in Chrome 57

Le schede in background possono avere un effetto negativo significativo sulle prestazioni del browser, in particolare sulla durata della batteria. Per mitigare questo problema, negli ultimi anni Chrome ha applicato diverse restrizioni alle schede in background. Recentemente sono stati effettuati diversi miglioramenti per apportare ulteriori miglioramenti; questo documento fornisce una panoramica dei criteri di Chrome. Questo documento è incentrato sulla descrizione dei criteri attuali in Chrome 57. La strategia a lungo termine e i piani ulteriori sono disponibili in questo documento.

Ottimizzare un'applicazione per lo sfondo

Gli sviluppatori web devono tenere presente che spesso gli utenti hanno molte schede aperte in background e questo può influire notevolmente sul consumo di batteria e sulla durata della batteria. Il lavoro in background deve essere ridotto al minimo, a meno che non sia assolutamente necessario per fornire una particolare esperienza utente. Deve essere utilizzata l'API Visibilità della pagina per rilevare quando la pagina viene riprodotta in background e sospendere tutte le operazioni non necessarie come gli aggiornamenti visivi.

Per alcuni siti, questa semplice ottimizzazione può ridurre l'utilizzo della CPU fino al 75%:

var doVisualUpdates = true;

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

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

Criteri

requestAnimationFrame()

Secondo la documentazione, Chrome non chiama requestAnimationFrame() quando una pagina è in background. Questa pratica è in vigore dal 2011.

Allineamento del timer in background

A partire da Chrome 11, ogni timer indipendente viene eseguito non più di una volta al secondo. Chrome esegue questi timer in batch una volta al secondo, garantendo che il numero di wakeup dei processi sia ridotto al minimo. Le pagine in cui viene riprodotto un audio udibile sono considerate visibili all'utente ed esenti dalla limitazione del timer in background. L'esenzione dura diversi secondi dopo l'interruzione della riproduzione dell'audio per consentire alle applicazioni di mettere in coda la traccia audio successiva.

Tieni presente che l'audio viene considerato udibile solo quando in Chrome viene visualizzata l'icona Audio. Gli stream audio silenziosi non concedono esenzioni.

Limitazione del timer in background in base al budget

Disponibile in Chrome 57, la limitazione del timer basata sul budget è un'ulteriore estensione del meccanismo di allineamento del timer, che stabilisce un limite aggiuntivo per l'utilizzo della CPU del timer in background. Il suo funzionamento è il seguente:

  • Ogni scheda in background ha un budget temporale (in secondi) per l'esecuzione in background dei timer.
  • Una pagina è soggetta a limitazioni di budget dopo 10 secondi in background.
  • Un'attività timer può essere eseguita solo se il budget di tempo non è negativo.
  • Dopo l'esecuzione di un timer, la sua durata viene sottratta dal budget.
  • Il budget viene rigenerato continuamente nel tempo (attualmente impostato su una frequenza di 0,01 secondi al secondo). Tieni presente che questo tasso di rigenerazione del budget può essere modificato man mano che Chrome raccoglie più dati sul comportamento della limitazione.

Esistono diverse esenzioni automatiche da questa limitazione:

  • Le applicazioni che riproducono audio sono considerate in primo piano e non sono limitate.
  • Applicazioni con connessioni in tempo reale (WebSocket e WebRTC), per evitare la chiusura di queste connessioni per timeout. In questi casi viene comunque applicata la regola run-timers-once-a-second.

Tieni presente che questo meccanismo utilizza il tempo totale di esecuzione, non il tempo di CPU. È una buona approssimazione del tempo di CPU e penalizza il blocco del thread principale per molto tempo.

Infine, ricorda che se utilizzi attività lunghe in background, l'applicazione può essere limitata per un periodo di tempo molto lungo (fino a 100 volte la durata dell'attività). Suddividi il tuo lavoro in blocchi di massimo 50 ms in base alle linee guida sulle prestazioni e utilizza il listener visibilityChange per evitare di svolgere operazioni non necessarie in background.

Disattivazioni

Chrome fornisce il flag --disable-background-timer-throttling per casi d'uso come l'esecuzione di suite di test e altri calcoli pesanti approvati dall'utente.