我想知道Timer类的精度在System.Timers中是什么,因为它是一个double(这似乎表明你可以有几分之一毫秒)。它是什么?
答案 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.Timer
和System.Threading.Timer
- 它们都会在8..16 ms左右发生系统误差,尤其是在小间隔(1000..6000 ms)时。定时器例程的每次后续调用都发生在第一次调用的间隔增加。例如,具有2000 ms间隔的计时器在2000,4012,6024,8036,10048毫秒等时触发(从Environment.TickCount
和Stopwatch.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情景!)。
查看链接的答案,了解有关详细信息的更多信息。