我有一个简单的 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/