在静态 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/