首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js是否强制setTimeout的最小延迟?

Node.js是否强制setTimeout的最小延迟?
EN

Stack Overflow用户
提问于 2011-08-28 22:16:30
回答 3查看 5.7K关注 0票数 38

在浏览器中,如果您从setTimeout调用的函数中使用setTimeout,那么将强制执行最小4ms的延迟。Mozilla的开发者wiki describes this behaviour,并提到它有become standardized in HTML5

‘s的documentation for setTimeout没有提到最小延迟。但是,the process.nextTick function的文档将其描述为比setTimeout(fn, 0)更有效的替代方案。这表明它可能更有效,因为它避免了这种延迟。否则,setTimeout(fn, 0)可能会被优化为具有相同的行为。

Node.js是否像web浏览器那样强制setTimeout的最小延迟?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-22 11:13:46

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

Node使用libuv,它是一个跨平台的抽象层,用于较低级别的系统,如文件系统、网络等。其中之一是计时器,Node提供了一个最小的包装器。在libuv级别,使用的计时器是系统特定的高精度计时器。例如,在Windows中,这是使用QueryPerformanceFrequencyFileTimeToSystemTime实现的,它们提供以纳秒为单位的分辨率。

在Node中,如果您指定了setTimeout(callback, 1),那么它将被延迟一毫秒(假设系统不会因为不堪重负而延迟它)。在浏览器中,由HTML5规范:https://developer.mozilla.org/en/DOM/window.setTimeout指定的最短时间为4毫秒。这不是保证的时间,只是最短的时间。大多数浏览器的分辨率都在15ms左右,这会影响DOM动画。

一条有效的信息是,在同一帧期间,设置为相同毫秒的超时将按照它们排队的顺序执行。如果您要执行以下操作:

代码语言:javascript
复制
  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

票数 22
EN

Stack Overflow用户

发布于 2011-08-28 22:39:19

从这个测试来看,它似乎没有最小的延迟。

如果您执行一个具有10ms持续时间的setTimeout(),并且长时间将返回值返回给控制台,那么您将得到以下结果:

代码语言:javascript
复制
 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持续时间,您将获得:

代码语言:javascript
复制
 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:属性,这似乎表明回调是立即调用的,尽管是异步调用。

代码语言:javascript
复制
var timer = setTimeout(function(){ console.log(timer);}, 0);

{ repeat: 0, callback: [Function] }

此外,如果我进行简单的开始/结束日期比较,我通常会得到从结束日期减去开始日期的结果为0

代码语言:javascript
复制
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完成的。

票数 15
EN

Stack Overflow用户

发布于 2012-01-18 18:45:31

应该注意的是,计时器的实现因操作系统而异。例如,我记得一个“很老的”JTimer问题,其中计时器的分辨率在Windows上是16ms,在其他平台上是~1ms。几乎可以肯定的是,它值得在您的特定服务器上进行测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7221504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档