【问题标题】:Is the timer resolution of the System.Diagnostics.Stopwatch class stable?System.Diagnostics.Stopwatch 类的计时器分辨率是否稳定?
【发布时间】:2012-10-18 15:29:02
【问题描述】:

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

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

【问题讨论】:

  • 不,它只是偶然匹配CPU频率。没有主板设计师选择可变频率。

标签: .net performance timer timing


【解决方案1】:

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.*

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

Time Stamp Counter(RDTSC - CPU 频率)的使用经常在这种情况下讨论,但没有真正的相关性:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2016-03-20
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多