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
属性的包装.
计时器和秒表之间存在差异,两者混淆了错误的假设.不幸的是,术语计时器常常用于表示多种事物.
运行Windows 2000或更高版本的任何计算机都可能具有高频计时器.我从来没有遇到过运行Windows 2000的计算机,而这台计算机没有这样的东西.
现在,这是高频计时器.还有计时器:Windows或.NET组件.这些定时器不用于保持时间或测量时间,而是用于定期执行动作.Windows计时器对象的分辨率为1毫秒,并且在计算机不参与CPU密集型操作时非常可靠..NET计时器对象的分辨率限制为大约15毫秒.您可以通过使用P/Invoke直接与Windows对象进行交互来解决这个问题,但通常不需要这样做.
.NET Stopwatch类基于高频计时器.通常,Start
查询性能计数器并存储该值.当你Stop
,它再次查询性能计数器.经过的时间是这两个值的简单减法.你可以从秒表获得比微秒分辨率更好的效果.
实际上,您可以使用Stopwatch
带有忙等待循环的a,它可以提供亚毫秒级的分辨率.我怀疑你可以用它获得亚微秒的分辨率.
需要了解的重要一点是,虽然定时器在1毫秒以内不可靠,但测量经过时间的秒表更精确.您可以信任秒表的微秒级经过时间测量值.除此之外,我不会指望它.
系统时间的实际分辨率约为毫秒(尽管声称是 1/10 毫秒,但我从未见过能够可靠提供该分辨率的工作站)。
但是,您可以使用其他硬件(例如时间码读取器)来提供低至纳秒的分辨率。这些通常用于与IPC(工业PC)一致的工业控制系统中以同步DAQ硬件。您可以在 PCI Express 插槽卡中看到分辨率为 100 ns 的示例。适用于 PCI Express 薄型 x1 本地总线的时间码处理器。
普通工作站几乎总是使用高分辨率计数器,但实际上,如果没有额外的硬件,分辨率将不会达到您所期望的(微秒或纳秒)。