Node.js是否对setTimeout执行最小延迟?

在浏览器中,如果使用setTimeout调用的函数内的setTimeout那么最小延迟4ms将被强制执行。 Mozilla的开发人员wiki 描述了这种行为 ,并提到它已经在HTML5中变得标准化了 。

Node.js的setTimeout文档没有提到最小延迟。 但是, process.nextTick函数的文档将其描述为setTimeout(fn, 0)的更有效的替代方法。 这表明它可能更有效率,因为它避免了这种延迟。 否则, setTimeout(fn, 0)可能会被优化以performance相同。

像Web浏览器一样,Node.js是否对setTimeout执行最小延迟?

它没有最小延迟,这实际上是浏览器和节点之间的兼容性问题。 定时器在JavaScript中是完全没有规定的(这是一个DOM规范,它在Node中没有用处,甚至没有被浏览器所遵循),节点实现它们仅仅是因为它们在JavaScript历史上有多么基础,以及它们在其他方面是不可替代的。

节点使用libuv作为跨平台的抽象层,用于文件系统,networking等低级系统。其中一个就是定时器,Node提供了一个最小的包装。 在libuv级别,所使用的定时器是系统特定的高精度定时器。 例如,在Windows中,这是使用QueryPerformanceFrequencyFileTimeToSystemTime来实现的,它提供了以纳秒为单位测量的分辨率。

在Node中,如果你指定了setTimeout(callback, 1)那么它将在1毫秒后执行(假设系统不会因为不堪重负而延迟)。 在浏览器中,HTML5规范指定的最短时间为4毫秒: https : //developer.mozilla.org/en/DOM/window.setTimeout 。 这不是一个保证的时间,只是一个最低限度。 预计大多数浏览器可能会有一个约15ms的分辨率影响DOManimation。

一个有效的信息是在同一帧期间设置为相同毫秒的超时将按照它们排队的顺序执行。 如果你这样做:

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

在一个块中,Node应该按照这个顺序调用它们。 这仅适用于具有完全相同的parsing时间的情况。

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

从这个testing来看,它似乎并没有起码的延迟。

如果你做了一个setTimeout() ,它的持续时间是10ms ,并且长时间返回到控制台,这就是你所得到的:

  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 } 

同样,持续1ms ,你会得到:

  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 } 

但是如果你持续0时间,你根本就没有得到一个_idleTimeout:属性,这似乎表明这个callback是立即调用的,尽pipe是asynchronous的。

 var timer = setTimeout(function(){ console.log(timer);}, 0); { repeat: 0, callback: [Function] } 

此外,如果我做简单的开始/结束date比较, 通常从结尾减去开始的结果是0

 var start = Date.now(); var timer = setTimeout(function(){ console.log(timer, Date.now() - start );}, 0); { repeat: 0, callback: [Function] } 0 

这些testing使用Node.js 0.5.2完成。

应该指出的是,计时器的实施将因操作系统而异。 例如,我记得一个“好老”的JTimer问题,其中计时器的分辨率在Windows上是16ms,在其他平台上是〜1ms。 这几乎肯定值得在您的特定服务器上进行testing。