.NET中Timer的最大精度是多少?

时间:2009-10-02 23:36:08

标签: c# .net timer precision

我想知道Timer类的精度在System.Timers中是什么,因为它是一个double(这似乎表明你可以有几分之一毫秒)。它是什么?

6 个答案:

答案 0 :(得分:9)

Windows桌面操作系统在大约40ms以下确实不准确。操作系统根本不是实时的,因此存在显着的非确定性抖动。这意味着虽然它可能会将值报告为毫秒甚至更小,但您无法真正指望这些值真正有意义。所以即使定时器间隔设置为某个亚毫秒值,你也不能依赖设置和触发之间的时间来实际上是你想要的。

除此之外,您运行的整个框架都是非确定性的(GC可以暂停您并在Timer应该触发时进行收集)并且您最终会遇到负载和风险做任何对时间至关重要的事情。

答案 1 :(得分:2)

System.Timers.Timer很奇怪。它使用double作为间隔,但实际上在其上调用Math.Ceiling并将结果转换为int以与底层System.Threading.Timer一起使用。它的理论精度是1ms,你不能指定超过2,147,483,647ms的间隔。鉴于此信息,我真的不知道为什么使用double作为区间参数。

答案 2 :(得分:2)

几年前我发现它准确到大约16毫秒......但遗憾的是我不记得细节了。

答案 3 :(得分:1)

您可以通过执行循环来轻松找到这一点,该循环会不断对结果持续时间进行采样并检查其步长的粒度。

答案 4 :(得分:0)

我比较System.Timers.TimerSystem.Threading.Timer - 它们都会在8..16 ms左右发生系统误差,尤其是在小间隔(1000..6000 ms)时。定时器例程的每次后续调用都发生在第一次调用的间隔增加。例如,具有2000 ms间隔的计时器在2000,4012,6024,8036,10048毫秒等时触发(从Environment.TickCountStopwatch.ElapsedTicks获得的时间戳,两者都给出相同的结果)。

答案 5 :(得分:0)

定时器分辨率下降到1ms的状态,没有太多的实施工作。 我刚刚在this answer中描述了double精度的原因。 将系统配置为以每秒1024个中断运行时(使用多媒体计时器API),中断之间的时间为0.9765625 ms。时间问题的标准分辨率是100ns。这些值存储为整数。无法存储值0.9765625 不会在100 ns分辨率的整数中失去准确性。最后一位数字(5)代表 500 ps。因此,分辨率必须高出三个数量级。存储这些时间 具有100 ps分辨率的整数值是没有希望的,因为在100 ps分辨率下的8字节整数将包裹大约21350天或大约58年。这个时间跨度太短,无法被任何人接受(请记住Y2K情景!)。

查看链接的答案,了解有关详细信息的更多信息。

相关问题