gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:47:21 25 4
gpt4 key购买 nike

目标

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

背景

我正在开发一个使用 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)

问题

我看到的每篇文章都有不同的说法,在我之前发布的问题中,不同的答案也有不同的说法。总体结论似乎是“没有结论,因为行为高度不一致”。

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

  1. 其中一个答案说 X 的最小值为 1。这仍然准确吗?
  2. 当 X -> 0 时,setTimeout(fn, X) 如何工作?

结论

我想要有关 setTimeout() 的更多信息,以便我可以围绕它构建我的代码。非常感谢链接到文档和文章日期或找到的答案。


感谢您的帮助!

最佳答案

与事件循环有关。想象一下一堆命令,node.js 一个接一个地执行。

setTimeout 是(简化版)“把它放在堆的末尾,不要在 Xmilliseconds 之前执行它”。

因此,虽然您确定它会等待 至少 那个时间,但您仍然需要等待 node.js 将该任务重新置于任务堆的顶部,这可能需要一些时间时间(以毫秒为单位)。

这也是为什么建议使用 process.nextTick,它将任务放在堆的顶部,而不是 setTimeout(callback, 0)

所以在你的例子中,setTimeout(callback, 1)内部不会转化为setTimeout(callback, 4),只是之前有3ms的开销一旦计时器结束,node.js 就会返回到该任务。如果事件循环中没有其他内容,并且您的处理器速度很快,您也许可以再缩短一毫秒,但 node.js 并不是为处理该级别的时间敏感任务而构建的。这将把它置于实时编程的领域,这完全是另一种用途。

从正确的 Angular 来看,setTimeout 在绝大多数用例中用于处理少数几秒钟,因此约为 1000 毫秒。多 2~3 毫秒真的有那么大的不便吗?

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

关于javascript - 当 setTimeout < 5 node.js 时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39870133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com