Chrome: tiempos de espera / intervalo suspendido en las pestañas de fondo?


Estaba probando la precisión de setTimeout usando esta prueba . Ahora me di cuenta de que (como era de esperar) setTimeout no es muy precisa, pero para la mayoría de los dispositivos no dramáticamente inexacta. Ahora si corro la prueba en Chrome y dejar que se ejecute en una pestaña de fondo (por lo tanto, cambiar a otra pestaña y navegar por allí), volver a la prueba y la inspección de los resultados te (si la prueba terminó) se cambian drásticamente. Parece que los tiempos de espera han estado corriendo mucho más lento. Probado en FF4 o IE9 esto no ocurrió.

Así que parece que Chrome suspende o al menos ralentiza la ejecución de javascript en una pestaña que no tiene foco. No pude encontrar mucho en la red sobre el tema. Significaría que no podemos ejecutar tareas en segundo plano, como por ejemplo comprobar periódicamente en un servidor usando llamadas XHR y setInterval (sospecho que ver el mismo comportamiento para setInterval, escribirá una prueba si el tiempo está conmigo).

Alguien Ha encontrado esto? ¿Habría una solución para esta suspensión / ralentización? ¿Lo llamarías un error y debería archivarlo como tal?

Author: KooiInc, 2011-05-17

5 answers

Hace poco pregunté sobre esto y es comportamiento por diseño. Cuando una pestaña está inactiva, solo se llama a la función a un máximo de una vez por segundo. Aquí está el cambio de código .

Quizás esto ayude: ¿Cómo puedo hacer que setInterval también funcione cuando una pestaña está inactiva en Chrome?

TL; DR: use Web Workers.

 65
Author: pimvdb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-04 20:59:32

Hay una solución para usar Web Workers, porque se ejecutan en procesos separados y no se ralentizan

He escrito un pequeño script que se puede usar sin cambios en su código: simplemente anula las funciones setTimeout, clearTimeout, setInterval, clearInterval

Solo inclúyelo antes de todo tu código

Http://github.com/turuslan/HackTimer

 19
Author: Ruslan Tushov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-28 22:23:07

Actualizé mi jQuery core a 1.9.1, y resolvió la discrepancia de intervalos en pestañas inactivas. Lo intentaría primero, luego buscaría otras opciones de anulación de código.

 2
Author: Carey Estes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-11 17:29:27

He lanzado worker-interval el paquete npm que establece la implementación deinterval y clearInterval con el uso de Web-Workers para mantenerse al día y ejecutarse en pestañas inactivas para Chrome, Firefox e IE.

La mayoría de los navegadores modernos (Chrome, Firefox e IE), intervalos (temporizadores de ventana) se sujetan para disparar no más de una vez por segundo en pestañas inactivas.

Puede encontrar más información el

Https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval

Https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Timeouts_and_intervals

 1
Author: gorkemcnr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 15:42:23

Reproducir un sonido ~vacío obliga al navegador a retener el rendimiento - lo descubrí después de leer este comentario: Cómo hacer que JavaScript se ejecute a velocidad normal en Chrome, incluso cuando la pestaña no está activa?

Necesito un rendimiento ilimitado bajo demanda para un juego de navegador que utiliza WebSockets, por lo que sé por experiencia que el uso de WebSockets no garantiza un rendimiento ilimitado, pero de las pruebas, la reproducción de un archivo de audio parece asegurarlo

Aquí hay 2 bucles de audio vacíos que he creado para este propósito, puede usarlos libremente, comercialmente: http://adventure.land / sounds/loops / empty_loop_for_js_performance.ogg http://adventure.land / sounds/loops / empty_loop_for_js_performance.wav

(Incluyen-58db ruido, - 60db no funciona)

Los juego, a petición del usuario, con Howler.js: https://github.com/goldfire/howler.js

function performance_trick()
{
    if(sounds.empty) return sounds.empty.play();
    sounds.empty = new Howl({
        src: ['/sounds/loops/empty_loop_for_js_performance.ogg','/sounds/loops/empty_loop_for_js_performance.wav'],
        volume:0.5,
        autoplay: true, loop: true,
    });
}

Es triste que no haya un método integrado para activar/desactivar el rendimiento completo de javascript por defecto, todavía, los criptomineros pueden secuestrar todos sus hilos de computación utilizando Trabajadores web sin ningún aviso: /

 1
Author: Kaan Soral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-05 12:52:40