Javascript 设置超时时会发生什么<;5 node.js 客观的

Javascript 设置超时时会发生什么<;5 node.js 客观的,javascript,node.js,settimeout,Javascript,Node.js,Settimeout,当X->0时,找出setTimeout(fn,X)的真实行为 背景 我正在开发一个使用setTimeout()进行QPS(每秒查询)测试的工具。最近,当我对1000个QP进行测试时,我感到很惊讶,该测试大约需要5秒来执行,而它本应该需要1秒(不包括任何其他外部因素) 对于较低的QPS值,测试效果良好,例如低于100 在调查过程中,我发现一些文章解释说,当进行setTimeout(fn,X)调用时,当X趋于0时,如果X太小,它将被修剪为更高的值 这方面的一个例子可以在2011年的问题中看到,其中旧

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

背景 我正在开发一个使用
setTimeout()
进行QPS(每秒查询)测试的工具。最近,当我对1000个QP进行测试时,我感到很惊讶,该测试大约需要5秒来执行,而它本应该需要1秒(不包括任何其他外部因素)

对于较低的QPS值,测试效果良好,例如低于100

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

这方面的一个例子可以在2011年的问题中看到,其中旧规范规定if
setTimeout(fn,X)
x0在哪里工作 结论 我想了解有关
setTimeout()
的更多信息,以便我可以围绕它构建代码。链接到文件和日期的文章或答案将得到高度赞赏



谢谢你的帮助

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

setTimeout
is(简化版)“将其放在堆的末尾,在xmills之前不要执行它”

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

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

因此,在您的示例中,
setTimeout(callback,1)
不会在内部转换为
setTimeout(callback,4)
,只是在node.js返回到该任务之前有3ms的开销,一旦计时器已过。如果事件循环中没有其他内容,并且处理器速度很快,则可以再减少毫秒,但node.js的构建并不能在该级别处理时间敏感的任务。这将使它进入实时编程领域,这是另一种用途

从长远来看,
setTimeout
在绝大多数用例中,用于处理几秒钟的时间,因此约1000毫秒。2~3毫秒真的有那么多不便吗


process.nextTick
还将允许node.js清理事件队列,并防止
RangeError:当您链接大量异步调用时,超出了最大调用堆栈大小
异常。

无论超时是否实际被设置为最小值,都会有最小的延迟,这仅仅是因为事件循环必须循环一次,这本身就有一点开销,可能它还必须处理过程中的其他事件。对于异步操作,除了“在
X
之后不久的某个时间”之外,根本无法保证定时。“QPS”到底是什么?Javascript计时器不是很精确,当然也不会低至一两毫秒。这可能会有所帮助:NodeJS不能精确延迟。它总是一个近似值。任何延误可能会或可能不会得到满足。大多数情况下,小于等于4的值不满足要求,但大于1000的值也不满足要求。@Sander,除非您使用的是专门实现它的库。我曾经准确地实现了一个需要375μs延迟的实时(-ish)协议。这是阻塞,但阻塞事件循环的时间不是问题。对于此类问题,您需要查看运行js代码的平台的文档,对于node.js,请查看此处
[…]当延迟大于2147483647或小于1时,延迟将设置为1。[…]
您可能应该注意到,
setImmediate
是非标准的,可能永远不会标准化。它确实在Node中工作,这有点奇怪,因为Google非常反对它,而且除了IE之外没有其他浏览器支持它。这一点很好。不过我并不觉得奇怪,
setImmediate
在node.js中有他的用处,但在客户端js中却毫无意义。在node.js中,它允许清除事件队列,而在客户端js中则没有这样的需要(甚至有事件队列吗?)。当然,在很少的情况下,您执行递归调用,
nextTick
是不合适的
setImmediate
是有用的。我的意思是,Node在V8、Google引擎和Google上实现了一个IE独有的功能,这有点奇怪,Google似乎都反对
setImmediate
,但计时器当然不是标准的一部分,可以很容易地添加,等等。我相信setImmediate也不能保证特定的计时。即,如果发生多个I/o事件,它可能会在指定时间之后触发。大多数应用程序可能没有问题,但1000 QPS的测试可能仍需要1000毫秒以上的时间。如果这是一个问题,您可以使用process.nextTick。啊,我的
进程不匹配。nextTick
setImmediate
。你的问题确实是建立在adeneo之上的