gpt4 book ai didi

timer - Dart:Timer.periodic 不遵守 VM 中的持续时间粒度

转载 作者:行者123 更新时间:2023-12-03 02:57:14 24 4
gpt4 key购买 nike

这可能是也可能不是错误,但我想帮助理解 Timer 的行为。

这是一个测试程序,它设置 Timer.periodic 的持续时间为 1000 微秒(1 毫秒)。触发的回调增加一个计数。一旦计数达到 1000 个间隔,程序就会打印耗时并退出。关键是在执行时间上接近 1 秒。考虑以下:

import 'dart:async'

main() {
int count = 0;
var stopwatch = new Stopwatch();
stopwatch.start();
new Timer.periodic(new Duration(microseconds: 1000), (Timer t) {
count++;
if(count == 1000){
print(stopwatch.elapsed);
stopwatch.stop();
}
});

结果是:
0:00:01.002953 

也就是说,仅超过一秒(假设剩余部分来自秒表的开始时间)。

但是,如果您将分辨率更改为低于 1 毫秒,例如500 微秒,Timer 似乎完全忽略了持续时间并尽快执行。

结果是:
0:00:00.008911 

我原以为这会接近半秒。这是定时器粒度的问题吗?将类似方案应用于 Future.delayed 时,也可以观察到此问题

最佳答案

定时器的最小分辨率为 1ms。当要求 500ns 的持续时间时,四舍五入到 0ms,也就是:尽可能快。
代码是:

int milliseconds = duration.inMilliseconds;
if (milliseconds < 0) milliseconds = 0;
return _TimerFactory._factory(milliseconds, callback, true);

也许它应该至少需要 1 毫秒,如果那是它的实际最小值,或者它应该在内部处理微秒,即使它只每 10-15 毫秒触发一次并且运行到目前为止未决的事件。

关于timer - Dart:Timer.periodic 不遵守 VM 中的持续时间粒度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34140488/

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