2012-03-10 9 views
40

me gustaría poner¿Cuál es el valor mínimo en milisegundos de setTimeout?

var minValue = 0; 
if (typeof callback == 'function') { 
    setTimeout(callback, minValue); 
} 

este código cuando implemente la función de devolución de llamada con JavaScript.

Pero he encontrado que los navegadores modernos y algunos navegadores antiguos

tienen diferente valor mínimo tiempo de espera.

Sé que cero no puede ser un valor mínimo.

¿Cuál sería el valor mínimo de setTimeout para

los navegadores modernos y algunos navegadores antiguos para problemas de compatibilidad?

+6

[Ver MDN.] (Https://developer.mozilla.org/en/DOM/window.setTimeout#Minimum_delay_and_timeout_nesting). Aunque cada vez que especifiques nunca es confiable. – pimvdb

+1

Siempre puede escribir una prueba ... –

+0

@BradChristie ¿Cómo puede usar UnitTest JavaScript code? TDD? – InspiredJW

Respuesta

39

Creo que 10 será el mínimo más confiable en todos los navegadores, ya que he visto muchos códigos que lo usan.

Sin embargo, 4ms is the minimum for HTML5

De hecho, 4 ms es especificado por la especificación HTML5 y es consistente a través de los navegadores lanzado en 2010 y en adelante. Antes de (Firefox 5.0/Thunderbird 5.0/SeaMonkey 2.2), el valor de tiempo de espera mínimo para los tiempos de espera anidados era de 10 ms.

+0

Lo siento, esto no es (¿ya no es?) Verdad. Simplemente no puedo encontrar una declaración sobre un retraso de 4 ms en [estándar] (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers), a excepción de una nota: "Nota: los temporizadores se pueden anidar; sin embargo, después de cinco temporizadores anidados, el intervalo se forzará a ser de al menos cuatro milisegundos". Una curiosidad adicional me llevó a [esta gran publicación] (https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/Hn3GxRLXmR0/XP9xcY_gBPQJ) en grupos de google sobre cómo lo hacen en Cromo. –

+0

@TobbeBrolin Si es cierto en la implementación, [todavía está en la especificación] (http://www.w3.org/TR/html5/webappapis.html#timers): "Si la tarea que se está ejecutando actualmente es una que fue creado por el método setTimeout() y el tiempo de espera es menor que 4, luego aumente el tiempo de espera a 4. " – apsillers

+2

@TobbeBrolin Sin embargo, no veo ese lenguaje reflejado en las especificaciones de WHATWG. Parece que el W3C y WHATWG no están de acuerdo con esto. – apsillers

9

El mínimo es 4 ms (a partir de HTML5) en el navegador moderno, antes de eso, era 10 ms. Tenga en cuenta que estos tiempos nunca son 100% precisos.

3

En este artículo se pone a prueba Firefox, Safari y Opera y parcelas gráficos de rendimiento:

http://ejohn.org/blog/analyzing-timer-performance/

Firefox 2, Opera y Safari todos tienen una ventana de fondo de 10 ms de retraso

Para navegadores antiguos, puede hacer una prueba como la de ese artículo. Acabo de ejecutar una prueba que tuve desde hace un tiempo de setInterval usando un intervalo de 10ms en IE6, y obtuve un promedio de 55ms. setTimeout parece ser menor en 35ms.

Ejecuté la prueba en Chromium y obtuve ~ 11ms promedio para un tiempo de espera de 10ms. Lo intenté con intervalos de 4ms y 1ms y obtuve ~ 4.5ms para ambos. Además, tenga en cuenta que los números pueden variar entre los sistemas operativos.

Si está interesado, aquí está el código de prueba:

<script> 
// number of times to call setTimeout before calculating average 
var ITERATIONS = 200; 

window.onload = function() 
{ 
    testTimeout(10, +new Date, 0, 0); 
} 

// calls setTimeout repeatedly at a specified interval, tracking the amount 
// of time that passes between successive calls 
function testTimeout(interval, last, sum, ii) 
{ 
    var time = +new Date; 
    var difference = time - last; 
    sum += difference; 
    if (ii % ITERATIONS == 1) 
    { 
     document.body.innerHTML = sum/ITERATIONS; 
     sum = 0; 
    } 
    window.setTimeout(
     function() { 
      testTimeout(interval, time, sum, ii + 1) 
     }, interval); 
} 
</script> 
3

setTimeout es más probable que llamar a la sleep or Sleep system call.

La mecánica real, incluida la cantidad mínima de milisegundos, de setTimeout es propiedad y/o depende del sistema, ya que no están en las especificaciones oficiales de ECMA. Depende de su tiempo de ejecución de JavaScript, así como también del sistema en el que lo está ejecutando.Dado que su tiempo de ejecución de JavaScript no agrega una gran cantidad de sobrecarga, la cantidad mínima de milisegundos está determinada por la resolución de división de tiempo de su sistema operativo y hardware. La cantidad de tiempo "más fácil de dormir" suele ser el tiempo que tarda el proceso en asignarse otro timeslice mediante el scheduling algorithm de su sistema.

En Windows (XP posterior), por ejemplo, revela the documentation for the sleep system call:

Un valor de cero hace que el hilo a renunciar al resto de su rebanada tiempo para cualquier otro hilo que está listo para funcionar. Si no hay otros hilos listos para ejecutarse, la función vuelve inmediatamente, y el hilo continúa la ejecución.

Eso significa que, bajo ciertas condiciones extremadamente raros, donde no hay otro proceso que se está a la espera de la hardware thread que su Javascript en tiempo de ejecución process está funcionando con energía, podría continuar inmediatamente, dependiendo de cómo el Javascript en tiempo de ejecución está implementado. Sin embargo, probablemente no observe esa condición muy a menudo :)

+1

verdadera respuesta real – Pinal

+4

Debo admitir que esta respuesta no me convence, ya que no coincide con lo que creo que sé acerca de javascirpt (principalmente) ejecución de un solo hilo basado en eventos. ¿Podría señalar alguna referencia que diga que cualquier implementación js llama 'sleep'? – Davide

+0

* "podría continuar inmediatamente, dependiendo de cómo se implemente su tiempo de ejecución de JavaScript" * - Si el tiempo de ejecución se implementa correctamente, el tiempo de espera no se ejecutará hasta que el código actual termine de ejecutarse, incluso si especifica un tiempo de 0. todavía hará cola. – nnnnnn

Cuestiones relacionadas