Es setInterval CPU intensivo?


Leí en alguna parte que setInterval es intensivo en CPU. Creé un script que usa setInterval y monitoreé el uso de la CPU, pero no noté ningún cambio. Quiero saber si hay algo que me perdí.

Lo que hace el código es comprobar si hay cambios en el hash en la URL (contenido después de #) cada 100 milisegundos y si ha cambiado, cargar una página usando AJAX. Si no ha cambiado, no pasa nada. ¿Habría algún problema de CPU con eso?

Author: Ryuku, 2011-07-11

6 answers

No creo que setInterval sea inherentemente va a causar problemas de rendimiento significativos. Sospecho que la reputación puede provenir de una época anterior, cuando las CPU eran menos poderosas.

Sin embargo, hay formas en las que puedes mejorar el rendimiento, y probablemente sea aconsejable hacerlas:

  1. Pasa una función a setInterval, en lugar de una cadena.
  2. Establecer el menor número posible de intervalos.
  3. Haga que las duraciones del intervalo sean lo más largas posible.
  4. Tener el código ejecutándose cada tiempo tan corto y simple como sea posible.

No optimizar prematuramente -- no hacer la vida difícil para ti cuando no hay un problema.

Una cosa, sin embargo, que puede hacer en su caso particular es usar el evento onhashchange, en lugar de tiempos de espera, en los navegadores que lo soportan.

 51
Author: lonesomeday,
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
2011-07-11 12:43:12

Prefiero decir que es todo lo contrario. Usando setTimeout y setInterval correctamente, drastical puede reducir el uso de la CPU del navegador. Por ejemplo, usar setTimeout en lugar de usar un bucle for o while no solo reducirá la intensidad del uso de la CPU, sino que también garantizará que el navegador tenga la oportunidad de actualizar la cola de la interfaz de usuario con más frecuencia. Por lo tanto, los procesos en ejecución no se congelarán ni bloquearán la experiencia del usuario.

Pero en general, usar setInterval realmente me gusta mucho en tu sitio puede ralentizar las cosas. 20 simultáneamente ejecutar intervalos con más o menos trabajo pesado afectará el espectáculo. Y otra vez.. usted realmente puede estropear cualquier parte supongo que no es un problema de setInterval.

..y por cierto, no necesitas revisar el hachís así. Hay eventos para eso:

onhashchange

Se disparará cuando haya un cambio en el hash.

window.addEventListener('hashchange', function(e) {
    console.log('hash changed, yay!');
}, false);
 14
Author: jAndy,
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-11-21 06:38:15

No, setInterval no es un uso intensivo de CPU en sí mismo. Si tiene muchos intervalos que se ejecutan en ciclos muy cortos (o una operación muy compleja que se ejecuta en un intervalo moderadamente largo), entonces que puede convertirse fácilmente en intensivo de CPU, dependiendo exactamente de lo que sus intervalos están haciendo y con qué frecuencia lo están haciendo.

No esperaría ver ningún problema con la comprobación de la URL cada 100 milisegundos en un intervalo, aunque personalmente aumentaría el intervalo a 250 milisegundos, solo porque no espero que la diferencia entre los dos sería notable para un usuario típico y porque generalmente trato de usar los intervalos de tiempo de espera más largos que creo que puedo salirme con la mía, particularmente para las cosas que se espera que resulten en un no-op la mayor parte del tiempo.

 9
Author: aroth,
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
2011-07-11 12:40:08

Hay un poco de marketing bajo el término "CPU intensive". Lo que realmente significa es"más CPU intensiva que algunas alternativas". No es "CPU intensivo" como en "utiliza una gran cantidad de potencia de CPU como un juego o un algoritmo de compresión haría".

Explicación:

Una vez que el navegador ha cedido el control se basa en una interrupción de el sistema operativo subyacente y el hardware para recibir el control y emitir la devolución de llamada de JavaScript. Tener duraciones más largas entre estos las interrupciones permiten que el hardware ingrese estados de baja potencia que disminuye significativamente el consumo de energía. De forma predeterminada, el sistema operativo Microsoft Windows y basado en Intel los procesadores utilizan resoluciones de 15,6 ms para estas interrupciones (64 interrupciones por segundo). Esto permite que los procesadores basados en Intel ingresen a su nivel más bajo estado de poder. Por esta razón, los desarrolladores web tradicionalmente solo han ha sido capaz de lograr 64 devoluciones de llamada por segundo cuando se utiliza setTimeout(0) al usar HTML4 navegadores que incluyen ediciones anteriores de Internet Explorer y Mozilla Firefox.

En los últimos dos años los navegadores han intentado aumentar el número de devoluciones de llamada por segundo que los desarrolladores de JavaScript pueden recibir a través de las API setTimeout y setInterval cambiando la energía consciente Configuración del sistema de Windows y evitar que el hardware ingrese bajo estados de poder. La especificación HTML5 ha llegado al extremo de recomendando 250 devoluciones de llamada por segundo. Esta alta la frecuencia puede resultar en un aumento del 40% en el consumo de energía, afectando la vida útil de la batería, gastos de funcionamiento, y el medio ambiente. Además, este enfoque no aborda el problema de rendimiento central de mejorar la CPU eficiencia y programación.

De http://ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html

 4
Author: user703016,
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
2011-07-11 12:40:42

En su caso no habrá ningún problema. Pero si está haciendo algunas animaciones enormes en canvas o trabajando con webgl , entonces habrá algunos problemas de CPU, por lo que puede usar requestAnimationFrame.

Consulte este enlace Acerca de requestAnimationFrame

 3
Author: Sarath,
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
2011-07-11 12:41:53

Tiempo de función > tiempo de intervalo es malo, no se puede saber cuando el hipo de la cpu o es lento y se acumula en la parte superior de las funciones en curso hasta que el pc se congela. Utilice settimeout o incluso mejor, process.nextick usando una devolución de llamada dentro de un settimeout.

 1
Author: huseyin tugrul buyukisik,
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
2016-11-25 16:10:16