Le schede in background possono avere un effetto negativo significativo sulle prestazioni del browser, soprattutto sulla durata della batteria. Per ovviare a questo problema, Chrome ha imposto varie limitazioni alle schede in background negli ultimi anni. Di recente, sono stati effettuati ulteriori sforzi per apportare ulteriori miglioramenti. Questo documento offre una panoramica del criterio di Chrome. Questo documento è incentrato sulla descrizione dei criteri attuali di Chrome 57. La strategia a lungo termine e ulteriori piani sono disponibili in questo documento.
Ottimizzazione di un'applicazione per l'esecuzione in background
Gli sviluppatori web devono essere consapevoli che gli utenti spesso hanno molte schede aperte in background e che questo può avere un grave impatto sul consumo energetico 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. L'API Page Visibility deve essere utilizzata per rilevare quando la pagina è in background e sospendere tutte le attività 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();
}
Norme
requestAnimationFrame()
Secondo la documentazione, Chrome non chiama requestAnimationFrame()
quando una pagina è in background.
Questo comportamento è attivo 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, assicurandosi che il numero di risvegli dei processi sia ridotto al minimo. Le pagine che riproducono audio udibile sono considerate visibili all'utente e sono esenti dalla limitazione dei 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 è considerato udibile se e solo se Chrome mostra l'icona audio. Gli stream audio senza audio non sono esenti.
Limitazione dei timer in background in base al budget
Disponibile in Chrome 57, la limitazione dei timer in base al budget è un'ulteriore estensione del meccanismo di allineamento dei timer, che impone un limite aggiuntivo all'utilizzo della CPU dei timer in background. Funziona nel seguente modo:
- Ogni scheda in background ha un budget di tempo (in secondi) per l'esecuzione dei timer in background.
- Una pagina è soggetta a limitazioni del budget di tempo dopo 10 secondi in background.
- Un'attività timer può essere eseguita solo quando il budget di tempo è non negativo.
- Dopo l'esecuzione di un timer, il relativo tempo di esecuzione viene sottratto dal budget.
- Il budget si rigenera continuamente nel tempo (attualmente impostato su una frequenza di 0,01 secondi al secondo). Tieni presente che questa frequenza di rigenerazione del budget può essere modificata man mano che Chrome raccoglie più dati sul comportamento di limitazione.
Esistono una serie di esenzioni automatiche da questa limitazione:
- Le applicazioni che riproducono audio sono considerate in primo piano e non vengono limitate.
- Applicazioni con connessioni in tempo reale (WebSocket e WebRTC), per evitare di chiudere queste connessioni per timeout. In questi casi viene comunque applicata la regola di esecuzione dei timer una volta al secondo.
Tieni presente che questo meccanismo utilizza il tempo reale, non il tempo della CPU. È una buona approssimazione del tempo della 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 lavoro in blocchi di massimo 50 ms in base alle linee guida sul rendimento e utilizza l'ascoltatore visibilityChange
per evitare di eseguire 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.