setTimeout 在 Linux 上精确但在 Windows 上不精确?
setTimeout is precise on Linux but not on Windows?
我有一个简单的 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'
但是在 Windows 系统上有 Node(v10.15.1):
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 上,它也只会 "precise",前提是您的 Node.js 实例的主线程从不忙于做其他事情,例如处理 I/O 完成或 运行 你的一些 JavaScript 逻辑。 Node.js 程序中只有一个主线程(您可以通过 Worker
拥有其他线程),它处理 I/O 完成回调和您的代码所做的任何其他事情(除非它在工作线程上)。 setTimeout
/setInterval
在任务队列中安排正常任务,该任务队列还包含其他任务(例如,再次 I/O 完成)。
如果您真的需要那么精确的计时,您可能至少需要将其移至工作线程,即使那样它也可能不精确。如果没有,您可能会更接近 setImmediate
循环。如果这还不够接近,您可能需要在 worker 中忙等待(这将固定 CPU 核心,但至少不会固定主线程)。
我有一个简单的 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'
但是在 Windows 系统上有 Node(v10.15.1):
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 上,它也只会 "precise",前提是您的 Node.js 实例的主线程从不忙于做其他事情,例如处理 I/O 完成或 运行 你的一些 JavaScript 逻辑。 Node.js 程序中只有一个主线程(您可以通过 Worker
拥有其他线程),它处理 I/O 完成回调和您的代码所做的任何其他事情(除非它在工作线程上)。 setTimeout
/setInterval
在任务队列中安排正常任务,该任务队列还包含其他任务(例如,再次 I/O 完成)。
如果您真的需要那么精确的计时,您可能至少需要将其移至工作线程,即使那样它也可能不精确。如果没有,您可能会更接近 setImmediate
循环。如果这还不够接近,您可能需要在 worker 中忙等待(这将固定 CPU 核心,但至少不会固定主线程)。