当setTimeout< 5 node.js

时间:2016-10-05 09:23:32

标签: javascript node.js settimeout

目的

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

背景

我正在开发一个使用setTimeout()进行QPS(每秒查询)测试的工具。我最近对1000 QPS进行了测试时感到很惊讶,当它应该花费大约5秒钟执行时它应该花费1(不计算任何其他外部因素)。

测试适用于较低的QPS值,例如低于100。

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

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

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

问题

我看到的每篇文章都说不同,在我之前发布的问题中,不同的答案也说不同的东西。整体所有结论似乎都是&#34; 没有结论,因为行为高度不一致&#34;。

回到node.js,由于我指出的问题很老,我想了解以下内容:

  1. 其中一个答案说X的最小值是1.这仍然准确吗?
  2. 当X - &gt;时setTimeout(fn, X)怎么样? 0工作?
  3. 结论

    我想了解有关setTimeout()的更多信息,以便我可以围绕它构建我的代码。我们将非常感谢您发现的文章或答案的文档和日期的链接。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

setTimeout是(dumbed版本)&#34;把它放在堆的末尾,并且不要在Xmilliseconds&#34;之前执行它。

因此,虽然您确定它将等待至少那段时间,您仍然需要等待node.js将该任务放回到堆栈顶部,这可能需要一些时间时间(以毫秒为单位)。

这也是为什么建议使用process.nextTick,将任务置于最重要的位置,而不是setTimeout(callback, 0)

所以在你的例子中,setTimeout(callback, 1)不会在内部转换为setTimeout(callback, 4),只是在node.js返回到该任务之后有一个3ms的开销。过去。如果事件循环中没有其他内容,并且您的处理器速度很快,那么您可以减少另一个毫秒,但node.js不是为了处理该级别的时间敏感任务而构建的。这将把它放在实时编程的领域,这是另一种用途。

为了正确看待问题,setTimeout在一个绝大多数的用例中,用于处理少数秒,所以~1000ms。是不是还要2~3ms呢?

process.nextTick还允许node.js清理事件队列,并在链接大量异步调用时阻止RangeError: Maximum call stack size exceeded异常。