Node.js setTimeout 分辨率很低且不稳定

Fla*_*der 5 resolution settimeout node.js

我遇到了分辨率问题setTimeout。当我将其设置为 50 毫秒时,它从 51 毫秒到甚至 80 毫秒不等。当我使用睡眠模块时,我能够获得像 50 \xc2\xb5s 这样的分辨率,那么setTimeout获得至少 1 毫秒的功能问题是什么?有什么办法可以解决/避免这个问题吗?睡眠的问题是,即使回调函数应该被触发,它也会延迟所有事情,它会等待...是否有其他解决方案可以延迟恰好 50 毫秒来触发某些事件?

\n

以睡眠模块为例:

\n
var start = new Date().getTime();\nsleep.usleep(50);\nconsole.log(new Date().getTime() - start);`\n
Run Code Online (Sandbox Code Playgroud)\n

结果是:0。microtime 表示它是 51 到 57 \xc2\xb5s。那到底是怎么回事?

\n

Alb*_*gni 2

来自setTimeout 文档

重要的是要注意,您的回调可能不会在精确的延迟毫秒内被调用

延迟的精度取决于代码阻塞的程度,这意味着如果您在代码的单个线程上执行大量操作,则setTimeout可能会触发大量延迟。相反,它几乎是准确的。

您可以亲自看到差异,执行此操作

var start = Date.now();
setTimeout(function() { console.log(Date.now() - start); }, 500);
for(var i=0; i<999999999; ++i){}

// 1237ms
Run Code Online (Sandbox Code Playgroud)

并注意与此的区别:

var start = Date.now();
setTimeout(function() { console.log(Date.now() - start); }, 500);

// 507ms
Run Code Online (Sandbox Code Playgroud)