37 votes

Est-ce que Node.js applique un délai minimum pour setTimeout ?

Dans les navigateurs, si vous utilisez setTimeout à l'intérieur d'une fonction appelée par setTimeout alors un délai minimum de 4ms sera appliqué. Wiki des développeurs de Mozilla décrit ce comportement et mentionne qu'il a deviennent standardisées dans le HTML5 .

Node.js la documentation pour setTimeout ne mentionne pas de délai minimum. Cependant, la documentation de le site process.nextTick fonction le décrit comme une alternative plus efficace à setTimeout(fn, 0) . Cela suggère la possibilité qu'il est plus efficace parce qu'il évite ce retard. Sinon, setTimeout(fn, 0) pourrait probablement être optimisé pour se comporter de la même manière.

Est-ce que Node.js impose un délai minimum pour setTimeout, comme le font les navigateurs web ?

22voto

benvie Points 6181

Il n'y a pas de délai minimum et il s'agit en fait d'un problème de compatibilité entre les navigateurs et le nœud. Les temporisations ne sont absolument pas spécifiées en JavaScript (c'est une spécification DOM qui n'a aucune utilité dans Node et qui n'est même pas suivie par les navigateurs de toute façon) et node les implémente simplement en raison de leur importance fondamentale dans l'histoire de JavaScript et de leur caractère irremplaçable.

Node utilise libuv qui est une couche d'abstraction multiplateforme pour les choses de bas niveau du système comme le système de fichiers, les trucs de réseau, etc. Une de ces choses est les timers, autour desquels Node fournit une enveloppe minimale. Au niveau de la libuv, les horloges utilisées sont les horloges de haute précision spécifiques au système. Sous Windows, par exemple, ceci est implémenté à l'aide de QueryPerformanceFrequency y FileTimeToSystemTime qui fournit une résolution mesurée en nanosecondes.

Dans Node, si vous spécifiez setTimeout(callback, 1) alors il sera exécuté une milliseconde plus tard (en supposant que le système ne le retarde pas pour cause de surcharge). Dans les navigateurs, le temps minimum sera de 4 millisecondes comme spécifié par la spécification HTML5 : https://developer.mozilla.org/en/DOM/window.setTimeout . Ce n'est pas un temps garanti, juste un minimum. On peut s'attendre à ce que la plupart des navigateurs aient une résolution de ~15ms, ce qui a un impact sur les animations DOM.

Un élément d'information valable est que les délais définis à la même milliseconde, pendant la même trame, seront exécutés dans l'ordre où ils ont été mis en file d'attente. Si vous le faites :

  setTimeout(callback1, 1);
  setTimeout(callback2, 1);
  setTimeout(callback3, 1);
  setTimeout(callback4, 1);

Tous dans un seul bloc, Node devrait les appeler dans cet ordre. Cela ne s'applique que s'ils ont exactement le même temps de résolution.

http://msdn.microsoft.com/en-us/library/Windows/desktop/ms644905(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/Windows/desktop/ms724280(v=vs.85).aspx

15voto

user113716 Points 143363

D'après ce test, il ne semble pas qu'il y ait un délai minimum.

Si vous faites un setTimeout() qui a un 10ms et long la valeur de retour à la console, voici ce que vous obtenez :

 var timer = setTimeout(function(){ console.log(timer);}, 10);

 { _idleTimeout: 10,
  _onTimeout: [Function],
  _idlePrev: null,
  _idleNext: null,
  _idleStart: Sun, 28 Aug 2011 14:34:41 GMT } 

De même, avec un 1ms durée, vous obtenez :

 var timer = setTimeout(function(){ console.log(timer);}, 1);

 { _idleTimeout: 1,
  _onTimeout: [Function],
  _idlePrev: null,
  _idleNext: null,
  _idleStart: Sun, 28 Aug 2011 14:34:59 GMT } 

Mais si vous faites un 0 durée, vous ne recevez pas de _idleTimeout: ce qui semble indiquer que le rappel est invoqué immédiatement, bien que de manière asynchrone.

var timer = setTimeout(function(){ console.log(timer);}, 0);

{ repeat: 0, callback: [Function] }

De plus, si je fais une simple comparaison des dates de début et de fin, je généralement obtenir 0 comme le résultat de la soustraction du début de la fin.

var start = Date.now();
var timer = setTimeout(function(){ console.log(timer, Date.now() - start );}, 0);

{ repeat: 0, callback: [Function] } 0

Ces tests ont été effectués en utilisant Node.js 0.5.2 .

1voto

rougeExciter Points 1253

Il convient de noter que l'implémentation des minuteurs varie selon le système d'exploitation. Par exemple, je me souviens d'un "bon vieux" problème de JTimer où la résolution du timer était de 16ms sous Windows, et ~1ms sur les autres plateformes. Cela vaut certainement la peine de tester sur votre serveur particulier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X