c# - 关于高分辨率性能计数器的解释及其与 .NET 秒表相关的存在?

标签 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:

Retrieves the frequency of the high-resolution performance counter, if one exists

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

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

最佳答案

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

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

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

.NET 秒表类基于高频计时器。通常,Start 查询性能计数器并存储值。当您停止 时,它会再次查询性能计数器。耗时是这两个值的简单减法。您可以从秒表获得优于微秒的分辨率。

事实上,您可以将 秒表 与忙等待循环一起使用,为您提供亚毫秒级的分辨率。我怀疑你能否用它获得亚微秒分辨率。

需要了解的重要一点是,虽然 计时器 超过 1 毫秒并不可靠,但测量耗时的秒表要精确得多。您或许可以相信 Stopwatch 提供的微秒级耗时测量值。除此之外,我不会指望它。

关于c# - 关于高分辨率性能计数器的解释及其与 .NET 秒表相关的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986701/

相关文章:

c# - 具有特殊字符的子串

.net - 在层之间使用接口(interface)

c# - 桌面 Java 应用程序替代方案

C# LockBits 性能(int[,] 到 byte[])

c - C++中复制字符串的函数选择,注重性能

c# - Azure 上的 WCF 与 STS

c# - CaSTLe Windsor "Container"和 "Kernel"有什么区别?

c# - 使用 OLEDB 读取 excel

.net - SQL Azure 文件存储

C# 一次绘制对象而不是使用循环