gpt4 book ai didi

node.js - setTimeout 在 Linux 上精确但在 Windows 上不精确?

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:59 26 4
gpt4 key购买 nike

我有一个简单的 setTimeout 用法:

var oldDate = new Date().getTime();

setInterval(function(){
var newDate = new Date().getTime();

console.log(newDate - oldDate, 'ms');

oldDate = newDate;
}, 7);

这会在带有 Node(v10.15.2) 的 Linux 系统上打印:

8 'ms'
6 'ms'
8 'ms'
7 'ms'
8 'ms'
8 'ms'

但是在带有 Node(v10.15.1) 的 Windows 系统上:

21 'ms'
22 'ms'
20 'ms'
20 'ms'
17 'ms'
23 'ms'
18 'ms'
20 'ms'
22 'ms'
17 'ms'
17 'ms'
22 'ms'
19 'ms'
20 'ms'
23 'ms'
19 'ms'
30 'ms'

这绝对是一团糟,并且运行非常随机。

我需要一个精确且无阻塞的计时器。在 Linux 中它就像一个魅力,但我很好奇,为什么它在 Windows 中那么糟糕?

谢谢!

最佳答案

您不能使用计时器子系统进行精确计时。

重要的是要了解,即使在 Linux 上,只有 Node.js 实例的主线程从不忙于执行其他操作(例如处理 I/O 完成或运行某些 JavaScript 逻辑)时,它才会“精确”。 Node.js 程序中只有一个主线程(您可以通过 Worker 有其他主线程),它处理 I/O 完成回调以及代码执行的任何其他操作(除非它位于工作线程上)。 setTimeout/setInterval 在任务队列中安排正常任务,该队列还保存其他任务(例如 I/O 完成)。

如果您确实需要如此精确的计时,您可能至少需要将其移动到工作线程,即使如此,它也可能不精确。如果没有,您可能会使用 setImmediate 循环来更接近。如果这还不够接近,您可能需要在工作线程中忙等待(这将固定 CPU 核心,但至少不是主线程)。

关于node.js - setTimeout 在 Linux 上精确但在 Windows 上不精确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57942804/

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