setTimeout <5 node.js时会发生什么

目的

当X> 0时setTimeout(fn, X)找出setTimeout(fn, X)的真实行为。

背景

我正在开发一个使用setTimeout()进行QPS(每秒查询)testing的工具。 我最近感到惊讶,当我做了1000个QPS的testing,花了大约5秒钟执行,当它应该采取1(不包括任何其他外部因素)。

例如,对于较低的QPS值,testing工作正常。

在调查的时候,我发现一些文章解释说,当setTimeout(fn, X)调用时,当X趋向于0时,如果X太小,它会被修剪到更高的值。

这个例子可以从2011年的这个问题中看到,旧规范指定如果setTimeout(fn, X)其中X <= 3),X将被自动设置为4。

  • setTimeout(fn,0)和setTimeout(fn,1)之间的区别?

这意味着两次执行setTimeout()之间我希望等待的最less时间是4毫秒。 如果我有setTimeout(fn, 1) ,它将被转换为setTimeout(fn, 4)

问题

我看到的每一篇文章都说了一些不同的东西,在我之前发布的问题中,不同的答案也是不同的。 总的来说,所有的结论似乎都是“ 没有结论,因为行为是非常不一致的 ”。

回到node.js,既然我指出的问题是相当古老的,我想要更新以下内容:

  1. 其中一个答案是X的最小值是1.这是否准确?
  2. 当X – > 0工作时setTimeout(fn, X)如何?

结论

我想了解更多有关setTimeout()信息,所以我可以在其周围构build我的代码。 链接到文件和文章的date或find答案将不胜感激。


谢谢您的帮助!

它与事件循环有关。 想象一堆顺序,那个node.js一个接一个地执行。

setTimeout是(虚弱版本)“把它放在堆栈的最后,不要在Xmilliseconds之前执行”。

所以,当你确定至less要等待那个时候,你仍然需要等待node.js把这个任务返回到堆栈顶部,这可能需要一些时间(以毫秒为单位)。

这也是为什么build议使用process.nextTick ,它将任务置于堆栈顶部,而不是setTimeout(callback, 0)

所以在你的例子中, setTimeout(callback, 1)不会被内部转换为setTimeout(callback, 4) ,只是在timer.js返回到这个任务之前有一个3ms的开销。 如果事件循环中没有别的东西,而且处理器速度很快,那么可能会缩短另一个毫秒,但是node.js并不是用来处理该级别的时间敏感任务的。 这将把它放在实时编程领域,这是另一个用途。

为了说明问题, setTimeout在大多数用例中被用于处理几秒钟,所以〜1000ms。 2〜3ms是否真的有这么多的不便?

process.nextTick也将允许node.js清理事件队列,并且在链接大量asynchronous调用时防止RangeError: Maximum call stack size exceededexception。