在静态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
:
检索高分辨率性能计数器的频率(如果存在)
然而,目前还不清楚它究竟存在的时候?我怀疑它通常存在于当前的机器上,但究竟不是吗?
这很有意思,因为当它不存在时,Stopwatch
只会成为DateTime.UtcNow
属性的一个包装。
答案 0 :(得分:5)
计时器和秒表之间存在差异,两者混淆了错误的假设。不幸的是,术语计时器常常用来表示多件事。
任何运行Windows 2000或更高版本的计算机都可能具有高频计时器。我从来没有遇到过运行过Windows 2000但没有这种东西的计算机。
现在,那是高频计时器。还有计时器:Windows或.NET组件。这些定时器不用于保持时间或测量时间,而是用于定期执行动作。 Windows计时器对象的分辨率为1毫秒,并且在计算机不参与CPU密集型操作时非常可靠。 .NET计时器对象的分辨率限制为大约15毫秒。您可以通过使用P / Invoke直接与Windows对象进行交互来解决这个问题,但通常不需要这样做。
.NET Stopwatch类基于高频计时器。通常,Start
查询性能计数器并存储该值。当您Stop
时,它会再次查询性能计数器。经过的时间是这两个值的简单减法。你可以从秒表中获得比微秒分辨率更好的效果。
事实上,你可以使用Stopwatch
一个繁忙等待循环,它可以提供亚毫秒级的分辨率。我怀疑你能用它获得亚微秒的分辨率。
要理解的重要一点是,尽管计时器在1毫秒以后不可靠,但测量经过时间的秒表更精确。您可以信任秒表的微秒级经过时间测量值。除此之外,我不会指望它。
答案 1 :(得分:1)
系统时间的实际分辨率大约为毫秒级(即使它声称是1/10毫秒,我从未见过可靠地提供该分辨率的工作站)。
但是,您可以使用额外的硬件(如时间码阅读器),提供低至纳秒的分辨率。这些通常用于符合IPC(工业PC)的工业控制系统,以同步DAQ硬件。您可以在 PCI Express Slot Cards. Time code processor for PCI express low-profile x1 local bus 中查看分辨率为100 ns的示例。
普通工作站几乎总是使用高分辨率计数器,但如果没有额外的硬件,实际上分辨率将不是您所期望的(微秒或纳秒)。