gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:12:05 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com