这个想法是现有的项目经常使用timeGetTime()(对于windows目标)。
milliseconds = timeGetTime();
现在,可以用
替换double tmp = (double) lpPerformanceCount.QuadPart/ lpFrequency.QuadPart;
milliseconds = rint(tmp * 1000);
lpPerformanceCount.QuadPart和lpFrequency.QuadPart取自对QueryPerformanceCounter()和QueryPerformanceFrequency()的单次调用。
我知道Windows的内部是一种伏都教,但是有人可以破译这两者中的哪一个更准确或/并且有更多的开销?
我怀疑准确性可能相同,但QueryPerformanceCounter可能会减少开销。但我没有硬数据支持它。
如果情况恰恰相反,我当然不会感到惊讶。
如果开销很小,我会更加关注准确性是否存在差异。
答案 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
。
有些人仍将accuracy
与granularity
混在一起。 QueryPerformanceCounter
具有更精细的粒度,
而timeGetTime具有更好的准确性。
但是,最快的源是GetSystemTimeAsFileTime
,它以100ns为单位返回时间值。但它的粒度不 100ns。它的粒度取决于结果
timeGetDevCaps以及timeBeginPeriod的设置。适当地设置后者可以导致大约10000的粒度,其对应于大约1ms。
我已经写了更多详情here。