2011-08-24 5 views
6

Aquí es una pieza de código de la fuente de jQuery (bit.ly/jqsource):setTimeout repetida() con 1 miliseg

// The DOM ready check for Internet Explorer 
function doScrollCheck() { 
    if (jQuery.isReady) { 
     return; 
    } 

    try { 
     // If IE is used, use the trick by Diego Perini 
     // http://javascript.nwbox.com/IEContentLoaded/ 
     document.documentElement.doScroll("left"); 
    } catch(e) { 
     setTimeout(doScrollCheck, 1); 
     return; 
    } 

    // and execute any waiting functions 
    jQuery.ready(); 
} 

Es un truco para detectar cuando el DOM está listo para IE. Aunque teóricamente esto parece muy bonito, estoy un poco preocupado por setTimeout(doScrollCheck, 1);, lo que significa que la función doScrollCheck() se llama 1000 veces por segundo antes de que el DOM esté listo.

¿Debo esperar que esto sea un drenaje de gran rendimiento?

+0

Tengo problemas para ver cómo esto * no * sería una pérdida de rendimiento. Por lo menos, está bloqueando el navegador, lo cual nunca es una buena idea. – Blazemonger

+1

Sí, esa es mi pregunta. ¿Por qué * no es * una fuga de rendimiento? (Porque asumo que la gente jQuery está haciendo un buen trabajo aquí.) – Randomblue

+4

IE tiene (¿o ha tenido?) Un mínimo de duración de 'setTimeout/setInterval' de algo así como' 13ms', por lo que no es tan malo como 1000 /segundo. Más como 77/segundo. De todos los problemas de rendimiento de IE, nunca escuché una queja de que '.ready()' de jQuery sea un gran drenaje. – user113716

Respuesta

3

La función setTimeout es casi nunca llamó exactamente a la hora solicitada. El navegador puede hacer +/- en unos pocos milisegundos, como mínimo, y si hay otro trabajo intenso en curso, puede retrasarse segundos o más. Como otros ya han mencionado, el navegador también implementa un tiempo de espera mínimo. Este 1 milisegundo simplemente le dice al navegador 'tan pronto como termines de hacer lo que sea que estés haciendo, házmelo saber para que pueda hacer algo'. También produce la ejecución desde el Javascript para que el navegador pueda volver a hacer lo que sea que vaya a hacer a continuación.

0

No creo que sea así - hasta que el DOM esté listo el usuario no puede iterar con una página de todos modos y la comprobación de cada 1ms se detiene tan pronto como se haya preparado DOM.

Además, esta función doScrollCheck no es lo mismo que hacer setInterval (doScrollCheck, 1). Este último no espera a que doScrollCheck realmente termine, sino que simplemente activará la función doScrollCheck tan rápido como sea posible - ESO podría ser un problema de rendimiento ya que podría haber docenas de llamadas superpuestas a la misma función.

No estoy seguro si he visto alguna otra manera de detectar que DOM está listo para comprobar algo (es propiedad disponible en documentElement en este caso) en intervalos más largos/más cortos.

+0

Los navegadores no utilizan múltiples hilos en el entorno de Javascript de forma predeterminada. La función setTimeout no se invocará hasta que el hilo de JavaScript activo haya producido la ejecución (procesamiento finalizado), como mínimo. – Zimzat

+0

Al hablar de docenas de llamadas superpuestas me refería a posible (aunque no se recomienda en términos de rendimiento) ejecutar algo como 'setInterval (doScrollCheck, 1)'. En ese caso, el navegador al menos cola las llamadas a doScrollCheck mientras (como usted mencionó) ** ejecutando ** de a una por vez. – WTK

+0

Creo que a lo que se refiere, pero no está claro por lo que ha dicho, si hay varias llamadas a doScrollCheck() desde fuera de la función, sucede lo que ha descrito. Si doScrollCheck() solo se llama una vez, el problema que describes no ocurre. Sospecho que han programado a la persona que llama de esta función para evitar que haga eso. – Zimzat

0

El intervalo de tiempo de espera mínimo es considerablemente mayor que 1 milisegundo. Si tu código estaba haciendo una gran cantidad de manipulación de DOM allí, incluso con la pausa forzada a un período más largo comenzarías a calentar la CPU.

Algunos navegadores nuevos (Firefox y Chrome, tal vez Safari) aumentan el tiempo de espera mínimo un mucho más para las pestañas y ventanas fuera de foco.

Incluso un milisegundo es una especie de mucho tiempo para una CPU moderna.