在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,由于我指出的问题很老,我想了解以下内容:
setTimeout(fn, X)
怎么样? 0工作? 我想了解有关setTimeout()
的更多信息,以便我可以围绕它构建我的代码。我们将非常感谢您发现的文章或答案的文档和日期的链接。
感谢您的帮助!
答案 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
异常。