这可能是也可能不是错误,但我想帮助理解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
我原本预计这会接近半秒钟。这是Timer的粒度问题吗?将类似的场景应用于Future.delayed
时,也可以观察到此问题答案 0 :(得分:2)
定时器的最小分辨率为1ms。当要求500ns的持续时间被四舍五入为0ms时,又称:尽可能快。 代码是:
int milliseconds = duration.inMilliseconds;
if (milliseconds < 0) milliseconds = 0;
return _TimerFactory._factory(milliseconds, callback, true);
也许它应该至少需要1ms,如果它是它的实际最小值,或者它应该在内部处理微秒,即使它只是每10-15毫秒触发一次并运行到目前为止的事件。
答案 1 :(得分:0)
如果您在VM中,它看起来像一个bug。请file an issue。
如果您在JS方面,请参阅以下关于Timer类文档的说明:
注意:如果使用Timer的Dart代码编译为JavaScript,则浏览器中可用的最细粒度为4毫秒。