Dart:Timer.periodic不遵守VM

时间:2015-12-07 18:20:28

标签: timer dart

这可能是也可能不是错误,但我想帮助理解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

时,也可​​以观察到此问题

2 个答案:

答案 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毫秒。

相关问题