在静态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
属性的包装器。
发布于 2013-03-22 12:54:23
计时器和秒表是有区别的,混淆两者会导致错误的假设。不幸的是,定时器这个词经常被用来指多个事物。
任何运行Windows 2000或更高版本的机器都有一个高频计时器。我从来没有遇到过一台后来运行Windows 2000的计算机,它没有这样的功能。
这是高频计时器。还有计时器: Windows或.NET组件。这些计时器不是用于保持时间或测量时间,而是用于定期执行操作。Windows计时器对象具有1ms的分辨率,并且在计算机不涉及CPU密集型操作时非常可靠。.NET定时器对象被限制在大约15 ms的分辨率。您可以通过使用P/Invoke直接与Windows对象进行交互来解决这个问题,但这并不经常是必要的。
.NET秒表类是基于高频定时器的。通常,Start
查询性能计数器并存储值。当您使用Stop
时,它会再次查询性能计数器。经过的时间是这两个值的简单减法。你可以从秒表中获得比微秒分辨率更高的分辨率。
事实上,您可以使用一个Stopwatch
,它有一个繁忙的等待循环,可以给出亚毫秒的分辨率。我怀疑你是否能用它获得亚微秒分辨率。
重要的是要明白,虽然计时器不可靠超过1毫秒,秒表,这是经过的时间,是更精确的。您可能可以信任秒表中的微秒级运行时间测量。除此之外,我不会指望它。
发布于 2011-08-08 11:56:49
系统时间的实际分辨率大约是毫秒(尽管声称它是毫秒的十分之一,但我从未见过一个工作站可靠地提供了该分辨率)。
但是,您可以使用其他硬件(如时间代码读取器),它提供的分辨率可降至纳秒。这些通常用于工业控制系统,以配合IPC(工业PC机)同步DAQ硬件。您可以在http://www.spectracomcorp.com/ProductsServices/TimingSynchronization/BuslevelTiming/PCIexpressslotcards/tabid/1296/Default.aspx中看到一个具有100 ns分辨率的示例。
普通工作站几乎总是使用高分辨率计数器,但实际上,如果没有额外的硬件,分辨率将不是你所期望的(微秒或纳米秒)。
https://stackoverflow.com/questions/6986701
复制