.NET中计时器的最高精度是多少?

10

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


请参阅 https://learn.microsoft.com/zh-cn/dotnet/api/system.timers.timer.interval 上的相关编程内容。 - jeroenh
6个回答

9
Windows桌面操作系统在40毫秒以下实际上并不准确。由于该操作系统不是实时的,因此会出现显著的非确定性抖动。这意味着,尽管它可能报告毫秒甚至更小的值,但您不能真正依赖这些值具有实际意义。因此,即使计时器间隔设置为某个亚毫秒值,您也不能指望设置和触发之间的时间实际上是您想要的。
此外,整个框架都是非确定性的(垃圾回收器可能会暂停您并在计时器应该触发的时间内进行收集),因此在进行任何时间关键型操作时存在大量风险。

这并不是特别关键;我正在为一个机器人模拟游戏编写一个“虚拟处理器”,它使用定时器以指定的速度执行指令,我只是想知道我可以将其设置多高。 - RCIX
1
我不会建议您尝试更频繁地运行,1毫秒的执行间隔已经足够了。操作系统调度程序在这种情况下也不会为您的应用程序提供更高的频率。 - ctacke

3

几年前我发现它的精度大约为16毫秒……但不幸的是我不记得细节了。


5
那将是15.625毫秒,等于系统时钟的频率64赫兹。 - Matt Howells

2

System.Timers.Timer比较奇怪。它使用double类型作为间隔参数,但实际上会调用Math.Ceiling函数将其转换为int类型,并将结果用于底层的System.Threading.Timer。因此,它的理论精度是1毫秒,而且你不能指定超过2,147,483,647毫秒的间隔。鉴于这些信息,我真的不知道为什么要使用double作为间隔参数。


1

你可以通过执行一个循环来轻松地自行发现这一点,该循环不断采样结果时间持续时间并检查它的步长粒度。


0
计时器分辨率可以轻松降至1毫秒范围内,无需太多实现工作。我刚刚在this answer中描述了使用双精度的原因。
当使用多媒体计时器API将系统配置为每秒1024次中断时,中断之间的时间为0.9765625毫秒。计时问题的标准分辨率为100纳秒,这些值存储为整数。值0.9765625无法以100纳秒分辨率的整数形式存储而不失去精度。最后一位数字(5)表示500皮秒。因此,分辨率必须高三个数量级。将这些时间值存储在100皮秒分辨率的整数中是没有希望的,因为100皮秒分辨率的8字节整数将在大约21350天或约58年后包装。这段时间太短,无法被任何人接受(请记住Y2K场景!)。
有关详细信息,请参见链接的答案。

0
我比较了 System.Timers.Timer 和 System.Threading.Timer - 它们都会在小间隔(1000..6000 ms)时产生大约 8..16 毫秒的系统误差。每次计时器例程的连续调用都会从第一次调用开始增加时间间隔。例如,2000ms 间隔的计时器会在 2000、4012、6024、8036、10048 毫秒等时刻触发(时间戳来自 Environment.TickCount 和 Stopwatch.ElapsedTicks,两者都提供相同的结果)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接