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

Val*_*zub 10 .net c# performance performancecounter dllimport

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

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

在MSDN上,它说QueryPerformanceFrequency:

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

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

这很有意思,因为当它不存在时,Stopwatch变成仅仅DateTime.UtcNow属性的包装.

Jim*_*hel 5

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

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

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

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

实际上,您可以使用Stopwatch带有忙等待循环的a,它可以提供亚毫秒级的分辨率.我怀疑你可以用它获得亚微秒的分辨率.

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


Teo*_*gul 1

系统时间的实际分辨率约为毫秒(尽管声称是 1/10 毫秒,但我从未见过能够可靠提供该分辨率的工作站)。

但是,您可以使用其他硬件(例如时间码读取器)来提供低至纳秒的分辨率。这些通常用于与IPC(工业PC)一致的工业控制系统中以同步DAQ硬件。您可以在 PCI Express 插槽卡中看到分辨率为 100 ns 的示例。适用于 PCI Express 薄型 x1 本地总线的时间码处理器

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