37 javascript settimeout node.js
在浏览器中,如果您setTimeout在被调用的函数中使用,setTimeout则将强制执行最小4ms的延迟.Mozilla的开发人员wiki 描述了这种行为,并提到它已经在HTML5中变得标准化了.
Node.js的文档setTimeout没有提到最小延迟.但是,该函数的文档将其process.nextTick描述为更有效的替代方法setTimeout(fn, 0).这表明它更有效的可能性,因为它避免了这种延迟.否则setTimeout(fn, 0)可能会被优化以表现相同.
Node.js是否像web浏览器那样强制执行setTimeout的最小延迟?
小智 22
它没有最小延迟,这实际上是浏览器和节点之间的兼容性问题.定时器完全没有在JavaScript中指定(它是一个DOM规范,在Node中没有用,甚至连浏览器都没有),节点实现它们只是因为它们在JavaScript的历史中有多么基础,以及它们在其他方面是多么不可替代.
Node使用libuv,这是一个跨平台抽象层,用于较低级别的系统事务,如文件系统,网络设备等.其中一个是定时器,Node提供最小的包装器.在libuv级别,使用的定时器是系统特定的高精度定时器.例如,在Windows中,这是使用QueryPerformanceFrequency并且FileTimeToSystemTime提供以纳秒为单位测量的分辨率来实现的.
在Node中,如果你指定setTimeout(callback, 1)那么它将在一毫秒后执行(假设系统不会因为被淹没而延迟它).在浏览器中,HTML5规范指定的最短时间为4毫秒:https://developer.mozilla.org/en/DOM/window.setTimeout.这不是保证时间,只是最低限度.大多数浏览器的分辨率约为15毫秒,这会影响DOM动画.
一个有效的信息是在同一帧期间设置为相同毫秒的超时将按它们排队的顺序执行.如果你这样做:
  setTimeout(callback1, 1);
  setTimeout(callback2, 1);
  setTimeout(callback3, 1);
  setTimeout(callback4, 1);
在一个块中,Node应该按顺序调用它们.这仅适用于具有完全相同的分辨率时间的情况.
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
use*_*716 15
从这个测试来看,它似乎没有最小的延迟.
如果您执行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:属性,这似乎表明回调是立即调用的,虽然是异步的.
var timer = setTimeout(function(){ console.log(timer);}, 0);
{ repeat: 0, callback: [Function] }
此外,如果我进行简单的开始/结束日期比较,我通常得到0从结尾减去开始的结果.
var start = Date.now();
var timer = setTimeout(function(){ console.log(timer, Date.now() - start );}, 0);
{ repeat: 0, callback: [Function] } 0
这些测试是使用Node.js 0.5.2.
| 归档时间: | 
 | 
| 查看次数: | 4879 次 | 
| 最近记录: |