【发布时间】:2013-08-19 15:37:28
【问题描述】:
我遇到了解决 setTimeout 的问题。当我将它设置为 50 毫秒时,它从 51 到甚至 80 毫秒不等。当我使用睡眠模块时,我能够获得 50 µs 的分辨率,那么 setTimeout 函数至少获得 1 ms 的问题是什么?有没有办法解决/避免这种情况? sleep 的问题在于,即使应该触发回调函数,它也会延迟一切,它会等待......是否有替代解决方案可以在恰好 50 毫秒的延迟中触发某些事件?
以睡眠模块为例:
var start = new Date().getTime();
sleep.usleep(50);
console.log(new Date().getTime() - start);`
结果是:0。而 microtime 表示它是 51 到 57 µs。那是什么鬼?
【问题讨论】:
-
您可能会对 John Resig 的“How JavaScript Timers Work”感兴趣。
-
但是,即使
setTimeout中的函数只是写new Date().getTime()它仍然是完全不可靠的! -
这篇文章解释了可靠性,这取决于事件循环空闲的频率。如果它正忙于另一个任务,则计时器必须等待该任务完成。
timeout值只是一个最小值,不是保证。 -
有没有办法让它更可靠?或任何其他解决方法?如果不使用 100% 的处理器,睡眠会很好。
-
之所以说 51 到 57 微秒是因为 V8 引擎处理下一行脚本需要这么长时间(1 到 7 微秒)。仅仅因为这对您来说是一行代码。 usleep 函数可能会进行一些系统调用,V8 引擎需要一段时间才能从这些调用中恢复过来并继续运行您的脚本。更何况,获取当前时间本身需要系统调用本身,这也需要时间。
标签: node.js settimeout resolution