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

时间:2011-08-08 18:23:06

标签: c# .net performance dllimport performancecounter

在静态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属性的一个包装。

2 个答案:

答案 0 :(得分:5)

计时器和秒表之间存在差异,两者混淆了错误的假设。不幸的是,术语计时器常常用来表示多件事。

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

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

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

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

要理解的重要一点是,尽管计时器在1毫秒以后不可靠,但测量经过时间的秒表更精确。您可以信任秒表的微秒级经过时间测量值。除此之外,我不会指望它。

答案 1 :(得分:1)

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

但是,您可以使用额外的硬件(如时间码阅读器),提供低至纳秒的分辨率。这些通常用于符合IPC(工业PC)的工业控制系统,以同步DAQ硬件。您可以在 PCI Express Slot Cards. Time code processor for PCI express low-profile x1 local bus 中查看分辨率为100 ns的示例。

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