¿Cuál es el valor mínimo de milisegundos de setTimeout?

me gustaría poner

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

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

Pero descubrí que los navegadores modernos y algunos navegadores antiguos

tienen un valor de tiempo de espera mínimo diferente.

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

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

navegadores modernos y algunos navegadores antiguos por problemas de compatibilidad?

preguntado el 10 de marzo de 12 a las 14:03

Ver MDN.. Aunque cualquier momento que especifique nunca es confiable. -

Siempre puedes escribir una prueba... -

@BradChristie ¿Cómo prueba el código JavaScript de UnitTest? ¿TDD? -

4 Respuestas

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

Sin embargo, 4ms es el mínimo para HTML5

De hecho, 4ms está especificado por la especificación HTML5 y es consistente en todos los navegadores lanzados 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.

respondido 10 mar '12, 14:03

Lo siento, esto no es (¿ya no?) cierto. Simplemente no puedo encontrar una declaración sobre un retraso de 4 ms en el estándar, excepto por una nota: "Nota: los temporizadores se pueden anidar; sin embargo, después de cinco temporizadores anidados, el intervalo debe ser de al menos cuatro milisegundos". Otra curiosidad me llevó a esta gran publicación en grupos de google sobre cómo lo hacen en Chrome. - tobbe brolin

@TobbeBrolin Si es cierto en la implementación, todavía está en la especificación: "Si la tarea que se está ejecutando actualmente es una tarea creada por el método setTimeout() y el tiempo de espera es inferior a 4, aumente el tiempo de espera a 4". - apsilleres

@TobbeBrolin Sin embargo, no veo ese idioma reflejado en las especificaciones de WHATWG. Parece que W3C y WHATWG no están de acuerdo con esto. - apsilleres

por lo tanto, si el nivel anidado es inferior a cinco, el valor más bajo es "1 ms" en Chrome chromium.googlesource.com/chromium/blink/+/master/Source/core/… - twxia

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

respondido 10 mar '12, 14:03

La demora de 4 ms es solo para cuando la llamada se realiza desde 5 niveles de anidamiento. - kaiido

@Kaiido, pero cómo muestra la práctica, nunca obtendrá un tiempo de espera igual a 4 ms, será de aproximadamente 5 ms. Maxim Pro

@MaximPro no estoy seguro de entender su comentario. El punto mío era que, contrariamente a lo que establece esta respuesta, no existe una restricción de tiempo de espera mínimo para los tiempos de espera que no están al menos en el quinto nivel de anidamiento. Entonces onclick=e=>setTimeout(fn,0) ejecutará fn en menos de 4 ms si nada más bloquea el navegador. (Había un mínimo de 1 ms en Chrome pero lo eliminaron) - kaiido

@Kaiido Acabo de enfatizar que el tiempo de espera entre los temporizadores anidados (que se anidarán 5 veces o más) será de aproximadamente 5 ms, eso es todo. - Maxim Pro

setTimeout lo más probable es que esté llamando al sleep or Sleep llamada al sistema.

La mecánica real, incluida la cantidad mínima de milisegundos, de setTimeout son propietarios y/o dependientes del sistema, ya que no se encuentran en las especificaciones oficiales de ECMA. Depende de su tiempo de ejecución de Javascript, así como 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 del intervalo de tiempo de su sistema operativo y hardware. La menor cantidad de tiempo "dormible" suele ser el tiempo que tarda el proceso en asignar otro porción de tiempo por su sistema algoritmo de programación.

En Windows (posterior a XP), por ejemplo, la documentación para la llamada del sistema de sueño revela:

Un valor de cero hace que el subproceso ceda el resto de su intervalo de tiempo a cualquier otro subproceso que esté listo para ejecutarse. Si no hay otros subprocesos listos para ejecutarse, la función regresa inmediatamente y el subproceso continúa la ejecución.

Eso significa que, bajo algunas condiciones extremadamente raras, donde no hay ningún otro proceso esperando actualmente en el hilo de hardware que su tiempo de ejecución de Javascript Procesos se está ejecutando, puede continuar inmediatamente después de que la persona que llama termine de ejecutarse, dependiendo de cómo se implemente el tiempo de ejecución de Javascript. Sin embargo, probablemente no observará tal condición muy a menudo :)

Respondido 01 Oct 18, 05:10

Debo admitir que esta respuesta no me convence, ya que no coincide con lo que creo que sé sobre javascirpt (en su mayoría) ejecución basada en eventos de un solo subproceso. ¿Podría señalar alguna referencia que diga que cualquier implementación js llama sleep? - David

"podría continuar de inmediato, 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, seguirá en cola. - nnnnnn

Lo dudo mucho. Especialmente sleep|Sleep las llamadas al sistema están involucradas en esto. Supongo que javascript tiene su propio mecanismo de programación y la granularidad dependerá en última instancia de la implementación particular del idioma del navegador. Pero javascript está basado en eventos y creo que estaría verificando eventos en un bucle y si hay alguno programado y "expirado" ejecutarlos. Es por eso que no es preciso (los milisegundos son grandes en este contexto, por lo que se debe esperar precisión) y también por qué debería haber un límite para setTimeout()parámetro de tiempo. - Iharob Al Asimi

Este artículo prueba Firefox, Safari y Opera y traza gráficos de rendimiento:

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

Firefox 2, Opera y Safari tienen una ventana inferior de 10 ms para retrasos

Para navegadores más antiguos, puede hacer una prueba como la de ese artículo. Acabo de hacer una prueba que tenía 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 ~ 11 ms promedio para un tiempo de espera de 10 ms. Lo probé con intervalos de 4 ms y 1 ms y obtuve ~ 4.5 ms para ambos. Además, tenga en cuenta que los números pueden variar entre los sistemas operativos.

Si estás 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>

respondido 10 mar '12, 15:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.