关于高分辨率性能计数器及其与.NET秒表相关的存在的说明?

在静态Stopwatch构造函数中,我们可以看到以下代码,它基本上检查是否存在高分辨率性能计数器。

 static Stopwatch() { if (!SafeNativeMethods.QueryPerformanceFrequency(out Frequency)) { IsHighResolution = false; Frequency = 0x989680L; tickFrequency = 1.0; } else { IsHighResolution = true; tickFrequency = 10000000.0; tickFrequency /= (double) Frequency; } } 

在MSDN上它说的是QueryPerformanceFrequency

检索高分辨率性能计数器的频率(如果存在)

然而,目前还不清楚它究竟存在的时候? 我怀疑它通常存在于当前的机器上,但究竟不是吗?

这很有趣,因为当它不存在时, Stopwatch变成了DateTime.UtcNow属性的一个包装器。

计时器和秒表之间存在差异,使两者混淆导致错误的假设。 不幸的是,术语计时器常常用于表示多种事物。

运行Windows 2000或更高版本的任何计算机都可能具有高频计时器。 我从来没有遇到过运行Windows 2000以后没有这种东西的计算机。

现在,这是高频计时器。 还有计时器:Windows或.NET组件。 这些定时器不用于保持时间或测量时间,而是用于定期执行动作。 Windows计时器对象的分辨率为1毫秒,并且在计算机不参与CPU密集型操作时非常可靠。 .NET计时器对象的分辨率限制为大约15毫秒。 您可以通过使用P / Invoke直接与Windows对象进行交互来解决这个问题,但这通常不是必需的。

.NET Stopwatch类基于高频计时器。 通常, Start查询性能计数器并存储该值。 Stop ,它会再次查询性能计数器。 经过的时间是这两个值的简单减法。 你可以从秒表获得比微秒分辨率更好的效果。

事实上,你可以创建一个带有忙等待循环的Stopwatch ,它可以提供亚毫秒级的分辨率。 我怀疑你能用它获得亚微秒的分辨率。

重要的是要理解,虽然定时器在1毫秒以内不可靠,但测量经过时间的秒表更加精确。 您可以信任秒表的微秒级经过时间测量值。 除此之外,我不会指望它。

系统时间的实际分辨率大约为毫秒(即使它声称是1/10毫秒,我从未见过可靠地提供该分辨率的工作站)。

但是,您可以使用额外的硬件(如时间码阅读器),提供低至纳秒的分辨率。 这些通常用于符合IPC(工业PC)的工业控制系统,以同步DAQ硬件。 您可以在PCI Express插槽卡中看到100 ns分辨率的示例 用于PCI的低速x1本地总线的时间码处理器

普通工作站几乎总是使用高分辨率计数器,但实际上,如果没有额外的硬件,分辨率将不是您所期望的(微秒或纳秒)。