System.Diagnostics.Stopwatch类的计时器分辨率是否稳定?

时间:2012-10-17 09:58:35

标签: .net performance timer timing

.Net支持使用System.Diagnostics.Stopwatch类的高分辨率计时。我知道这个类使用的具体分辨率因底层硬件而异,可以通过静态属性Stopwatch.Frequency获得。

此频率似乎与CPU频率有关,Stopwatch读取此值并将其存储在静态初始值设定项/构造函数中的静态类变量中。因此,我现在想知道如果CPU时钟发生变化,这个类是否会报告错误的时序?例如在根据系统负载改变CPU时钟的系统中。

1 个答案:

答案 0 :(得分:2)

MSDN:

*The Frequency value depends on the resolution of the underlying timing mechanism. If the installed hardware and operating system support a high-resolution performance counter, then the Frequency value reflects the frequency of that counter. Otherwise, the Frequency value is based on the system timer frequency.*

秒表的来源。频率不是CPU频率。它是高频硬件计数器的频率。在Windows上,此计数器频率通常也通过调用QueryPerformanceCounter function来读取,而在High Resolution POSIX Timers上用于获得高分辨率时序。

在此上下文中经常讨论Time Stamp Counter(RDTSC - CPU频率)的使用,但没有真正的相关性:

某些较旧的硬件可能无法提供任何高频硬件用于计时目的,因此CPU的频率可用作替代品。当使用CPU频率进行定时时,需要确保频率保持不变。更现代的硬件提供动态CPU频率修改。在动态修改时使用CPU频率作为衡量标准会导致混乱。

幸运的是,这是non existing的情况。可以修改CPU频率的系统更加现代化。这种现代系统也有一个单独的高频定时器硬件High Precision Event Timer

有传言称在多核系统上使用CPU频率。事实上,某些硬件存在问题。但那是很久以前的事了,已经有一段时间了。