C# NET中计时器的最大精度是多少?

C# NET中计时器的最大精度是多少?,c#,.net,timer,precision,C#,.net,Timer,Precision,我想知道System.Timers中Timer类的精度是多少,因为它是双精度的(这似乎表明可以有毫秒的分数)。这是什么?Windows桌面操作系统在40毫秒以下确实不准确。操作系统不是实时的,因此会出现明显的不确定性抖动。这意味着,虽然它可能会报告低至毫秒甚至更小的值,但你不能指望这些值真的有意义。因此,即使定时器间隔被设置为亚毫秒的值,你也不能依靠设置和触发之间的时间来实现你想要的 此外,您正在运行的整个框架是不确定的(GC可能会在计时器启动的时间内暂停您并执行收集),并且您最终会面临大量的风

我想知道System.Timers中Timer类的精度是多少,因为它是双精度的(这似乎表明可以有毫秒的分数)。这是什么?

Windows桌面操作系统在40毫秒以下确实不准确。操作系统不是实时的,因此会出现明显的不确定性抖动。这意味着,虽然它可能会报告低至毫秒甚至更小的值,但你不能指望这些值真的有意义。因此,即使定时器间隔被设置为亚毫秒的值,你也不能依靠设置和触发之间的时间来实现你想要的


此外,您正在运行的整个框架是不确定的(GC可能会在计时器启动的时间内暂停您并执行收集),并且您最终会面临大量的风险,试图执行任何对时间至关重要的操作。

System.Timers.Timer很奇怪。它使用一个double作为间隔,但实际上调用了Math.天花,并将结果转换为int,以用于底层的System.Threading.Timer。理论精度为1ms,不能指定超过2147483647ms的间隔。考虑到这些信息,我真的不知道为什么使用双精度作为间隔参数。

几年前,我发现它精确到16ms左右。。。但不幸的是,我不记得细节。

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

我比较了
System.Timers.Timer
System.Threading.Timer
——它们都给出了大约8..16的系统错误毫秒,特别是在小间隔(1000..6000毫秒)上。从第一次调用开始,计时器例程的每次后续调用都会增加间隔。例如,间隔为2000毫秒的计时器在2000、4012、6024、8036、10048毫秒等时间内触发(从
环境.TickCount
秒表.ElapsedTicks
获得的时间戳都给出了相同的结果)。

计时器分辨率下降到1ms范围,而无需太多的实现工作。 我刚刚在中描述了
双精度的原因。
将a系统配置为每秒1024次中断时(使用多媒体计时器API),中断之间的时间为0.9765625 ms。计时问题的标准分辨率为100ns。这些值存储为整数。无法存储值0.9765625
在100纳秒分辨率下,不丢失整数精度。最后一位数字(5)表示
因此,分辨率必须高出三个数量级。存储这些时间
分辨率为100ps的整数中的值是没有希望的,因为分辨率为100ps的8字节整数将在21350天或58年后结束。这个时间跨度太短,任何人都无法接受(还记得Y2K场景吧!)


查看链接到的答案以了解更多详细信息。

这不是特别关键;我正在为一个机器人模拟游戏编写一个“虚拟处理器”,它使用一个定时器以指定的速度执行指令,我只是想知道我能把它设置得多高。我不会尝试使用超过1ms的频率。无论如何,操作系统调度程序不会对你的应用程序执行比这更频繁的操作。这将是15.625ms==64Hz,系统时钟的频率。