Javascript v8 Atomics.wait timeout为什么错误如此之大?

Javascript v8 Atomics.wait timeout为什么错误如此之大?,javascript,v8,Javascript,V8,v8 shell执行以下代码: var msleep = n => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n); var t = Date.now();msleep(1000);Date.now() - t; 输出: 1005 为什么会出现几毫秒的错误 是一个仅0.1毫秒错误的生锈示例。可能您的机器正忙?这就是为什么任何事情都需要比预期更长时间的主要原因 请注意,您不仅要测量超时,还要测量函数调用、对象

v8 shell执行以下代码:

var msleep = n => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n);
var t = Date.now();msleep(1000);Date.now() - t;
输出:

1005
为什么会出现几毫秒的错误


是一个仅0.1毫秒错误的生锈示例。

可能您的机器正忙?这就是为什么任何事情都需要比预期更长时间的主要原因

请注意,您不仅要测量超时,还要测量函数调用、对象创建(可以触发短时间的GC活动)、消息循环泵送以及对系统库的调用

后者尤其可以解释这一点:在某些操作系统上,默认的计时器分辨率大于1ms,因此当请求的超时时间用完时,内核可能会等到下一个计时器滴答作响后再通知进程

FWIW,我无法重现你的观察结果。我看到的大部分是1000,有时是1001,这几乎是我所期望的:

d8> var msleep = n => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n);
d8> function measure() { var t = Date.now(); msleep(1000); return (Date.now() - t); }
d8> for (var i = 0; i < 30; i++) print(measure());
1000
1000
1001
1000
1000
1000
1000
1001
1000
1000
1000
1000
1001
1000
1000
1000
1000
1001
1000
1000
1000
1000
1000
1000
1000
1000
1000
1001
1000
1000
而不是:

var elapsed;
function start_stopwatch_DONT_DO_THIS() {
  elapsed = 0;
  window.setTimeout(update_display_DONT_DO_THIS, 1000);
}
function update_display_DONT_DO_THIS() {
  elapsed += 1000;  // This is going to be inaccurate!
  call_display_function(elapsed);
  window.setTimeout(update_display_DONT_DO_THIS, 1000);
}

谢谢,我在使用linux测试时也得到了你的结果,你的建议也很有用。
var elapsed;
function start_stopwatch_DONT_DO_THIS() {
  elapsed = 0;
  window.setTimeout(update_display_DONT_DO_THIS, 1000);
}
function update_display_DONT_DO_THIS() {
  elapsed += 1000;  // This is going to be inaccurate!
  call_display_function(elapsed);
  window.setTimeout(update_display_DONT_DO_THIS, 1000);
}