有人可以破译timeGetTime()或QueryPerformanceCounter / QueryPerformanceFrequency是否具有较低的开销或/和准确性?

时间:2010-08-04 16:47:03

标签: c# c++ c windows winapi

这个想法是现有的项目经常使用timeGetTime()(对于windows目标)。

milliseconds = timeGetTime();

现在,可以用

替换
double tmp = (double) lpPerformanceCount.QuadPart/ lpFrequency.QuadPart; 
milliseconds = rint(tmp * 1000);

lpPerformanceCount.QuadPart和lpFrequency.QuadPart取自对QueryPerformanceCounter()和QueryPerformanceFrequency()的单次调用。

我知道Windows的内部是一种伏都教,但是有人可以破译这两者中的哪一个更准确或/并且有更多的开销?

我怀疑准确性可能相同,但QueryPerformanceCounter可能会减少开销。但我没有硬数据支持它。

如果情况恰恰相反,我当然不会感到惊讶。

如果开销很小,我会更加关注准确性是否存在差异。

5 个答案:

答案 0 :(得分:2)

timeGetTime()的准确性是可变的,基于上次使用的timeBeginPeriod。它永远不会超过一毫秒。 QueryPerformanceCounter也是可变的,具体取决于硬件支持。它永远不会差于大约一微秒。

它们都没有显着的开销,QPC可能有点重。从你的问题来看,这对你来说是否重要。我怀疑它,但衡量。有了QPC。

答案 1 :(得分:1)

注意:QueryPerformanceCounter可能依赖于处理器。如果您的线程在一个CPU上抓取perf计数器,并在再次抓取之前在另一个CPU上结束,则结果可能不可靠。请参阅MSDN entry

答案 2 :(得分:1)

QPC的准确度更高。 timeGetTime在1-10ms范围内是准确的(并且其分辨率不超过1ms),而QPC可以在微秒范围内提供精确度。

开销各不相同。 QPC使用最好的硬件定时器。这可能是内置在CPU中的一些轻量级,或者它可能必须到主板,这会增加显着的延迟。而且,由于必须通过一个驱动程序来纠正计时器硬件的错误,它可能会变得更加昂贵。

但两者都不贵。如果你不打算每秒数百万次调用计时器,那么两者的开销都是微不足道的。

答案 3 :(得分:1)

我们更新了QueryPerformanceCounter的文档,这有助于回答上述问题。请参阅

http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx

埃德布里格斯 微软公司

答案 4 :(得分:0)

QueryPerformanceCounter并没有给你时间。为了转换它的价值 进入时间测量你必须使用QueryPerformanceFrequency 让你知道计数器增加的速率。但频率值更多或 少估计。计数器的频率可以随着底层硬件和OS的版本而变化。但它不应被认为是一个常数。它有一个偏移,有时伴随着热漂移。 这样说,我建议小心使用QueryPerformanceCounter

有些人仍将accuracygranularity混在一起。 QueryPerformanceCounter具有更精细的粒度, 而timeGetTime具有更好的准确性。

但是,最快的源是GetSystemTimeAsFileTime,它以100ns为单位返回时间值。但它的粒度 100ns。它的粒度取决于结果 timeGetDevCaps以及timeBeginPeriod的设置。适当地设置后者可以导致大约10000的粒度,其对应于大约1ms。

我已经写了更多详情here