gpt4 book ai didi

javascript - v8 Atomics.wait timeout 为什么误差这么大?

转载 作者:行者123 更新时间:2023-12-03 01:21:04 28 4
gpt4 key购买 nike

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

为什么会有几毫秒的误差?

Here是一个 Rust 的例子,误差仅为 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 start_time;
function start_stopwatch() {
start_time = Date.now();
window.setTimeout(update_display, 1000);
}
function update_display() {
var current_time = Date.now();
call_display_function(current_time - start_time);
window.setTimeout(update_display, 1000); // Could be 876 for all we care.
}

而不是:

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);
}

关于javascript - v8 Atomics.wait timeout 为什么误差这么大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51760561/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com