web-dev-qa-db-fra.com

Quelle est la valeur minimale en millisecondes de setTimeout?

Je voudrais mettre

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

ce code lorsque j'implémente la fonction de rappel avec JavaScript.

Mais j'ai trouvé que les navigateurs modernes et certains anciens navigateurs

avoir une valeur de timeout minimum différente.

Je sais que zéro ne peut pas être une valeur minimale.

Quelle serait la valeur minimale de setTimeout pour

navigateurs modernes et anciens navigateurs pour des problèmes de compatibilité?

43
InspiredJW

Je pense que 10 sera le minimum le plus fiable de tous les navigateurs, car j'ai vu beaucoup de codes l'utiliser.

Cependant, 4 ms est le minimum pour HTML5

En fait, 4 ms est spécifié par la spécification HTML5 et est cohérent entre les navigateurs lancés en 2010 et au-delà. Avant (Firefox 5.0/Thunderbird 5.0/SeaMonkey 2.2), la valeur de délai d'attente minimale pour les délais d'attente imbriqués était de 10 ms.

43
Martin.

Le minimum est de 4 ms (à partir de HTML5) dans un navigateur moderne, avant cela, il était de 10 ms. Notez que ces temps ne sont jamais précis à 100%.

9
Madara Uchiha

Cet article teste Firefox, Safari et Opera et trace les graphiques de performances:

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

Firefox 2, Opera et Safari ont tous une fenêtre inférieure de 10 ms pour les retards

Pour les navigateurs plus anciens, vous pouvez effectuer un test comme celui de cet article. Je viens de lancer un test que j'ai eu il y a quelque temps sur setInterval en utilisant un intervalle de 10 ms dans IE6, et j'ai obtenu une moyenne de 55 ms . setTimeout semble être inférieur à 35 ms .

J'ai exécuté le test dans Chromium et obtenu ~ 11 ms en moyenne pour un délai d'attente de 10 ms. Je l'ai essayé avec des intervalles de 4 ms et 1 ms et j'ai obtenu ~ 4,5 ms pour les deux. Gardez également à l'esprit que les chiffres peuvent varier selon les systèmes d'exploitation.

Si vous êtes intéressé, voici le code de test:

<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
Devourant

setTimeout appelle très probablement l'appel système sleep ou Sleep .

La mécanique réelle, y compris le nombre minimum de millisecondes, de setTimeout est propriétaire et/ou dépendante du système, car elle ne fait pas partie des spécifications officielles de l'ECMA. Cela dépend de votre exécution Javascript, ainsi que du système sur lequel vous l'exécutez. Étant donné que votre exécution Javascript n'ajoute pas beaucoup de frais généraux, le minimum de millisecondes est déterminé par la résolution de la tranche de temps de votre système d'exploitation et de votre matériel. La plus petite période de "sommeil" est généralement le temps qu'il faut pour que le processus se voit attribuer un autre tranche de temps par algorithme de planification de votre système.

Sous Windows (post XP) par exemple, la documentation de l'appel système sleep révèle:

Une valeur de zéro oblige le thread à abandonner le reste de sa tranche de temps à tout autre thread prêt à s'exécuter. S'il n'y a aucun autre thread prêt à s'exécuter, la fonction retourne immédiatement et le thread continue son exécution.

Cela signifie que, dans des conditions extrêmement rares, où aucun autre processus n'est actuellement en attente sur le thread matériel sur lequel votre exécution Javascript processus s'exécute, il peut continuer immédiatement une fois l'exécution de l'appelant terminée, selon la façon dont votre exécution Javascript est implémentée. Vous n'observerez probablement pas une telle condition très souvent cependant :)

3
Domi