首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用QueryPerformanceCounter()向后运行的时间

用QueryPerformanceCounter()向后运行的时间
EN

Stack Overflow用户
提问于 2014-12-11 09:20:48
回答 2查看 1.3K关注 0票数 4

我已经找到了关于QueryPerformanceCounter在这个职位中使用的有用信息,但是我面临着一个我还没有找到答案的问题。

我正在为WindowsCE6.0开发一个应用程序,并且需要GetTickCount能够提供的更好的解决方案。这就是我选择QueryPerformanceCounter函数的原因。

我观察到,我得到的反值是来回的。虽然它不是最终的应用程序,但这个小示例解释了这个问题:

代码语言:javascript
复制
int i;
BOOL bRet;
LARGE_INTEGER liCounter;


for ( i = 0; i < 100; i++)
{
    bRet = QueryPerformanceCounter(&liCounter);
    if(bRet)
    {
        printf("Counter Value: %llu \n", liCounter.QuadPart);
    }

}

它打印一系列的100个计数器值,这些值预计是增量的。但是,有一些反值相对于以前的值会减少。例如:

..。

反值: 6536266821

计数器值: 6536266262

反值: 6536266604

..。

这种行为是有问题的,因为在最后的应用程序中,执行了类型的操作(EndCounterValue StartCoutnerValue),并且在相同的情况下发现了负的时间间隔。

我读过(这里)这个问题,在使用多核平台时可以找到。但是,情况并非如此,因为Windows CE 6.0不支持多核处理。

任何帮助,以找到为什么会发生这种情况和/或任何解决办法,以避免这个问题,将不胜感激。

编辑

我编辑这个问题是为了包括更多的信息:

一个更长的连续阅读列表(不同于上面的列表):

反值: 15234261579

反值: 15234261594

反值: 15234261609

反值: 15234261624

反值: 15234261640

计数器值: 15234261064

反值: 15234261079

反值: 15234261094

反值: 15234261109

反值: 15234261125

反值: 15234261140

反值: 15234261155

反值: 15234261170

反值: 15234261185

反值: 15234261201

反值: 15234261216

反值: 15234261231

反值: 15234261246

在硬件方面,我们正在使用Intel Celeron 1047 used处理器和HM76芯片组。

当调用QueryPerformanceFrequency时,读取1.19MHz的频率。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-11 10:27:26

反值: 6536266821 计数器值: 6536266262 计数器值: 6536266604

即使是第三读也比第一读小!但这里有什么关系呢?您应该使用QueryPerformanceFrequency()阅读性能计数器频率,以研究几百个计数的差异实际上意味着什么。如果频率在MHz范围内,这仍然比毫秒好得多。您能提供一个更长的QueryPerformanceCounter()连续读取列表吗?

您还应该提供有关硬件的更多详细信息。性能计数器使用的资源是什么?获取高分辨率时间戳可以帮助您获得更详细的视图。

考虑到循环的线性行为,您可以绘制值与时间的关系图。这可能会使问题更加具体。它还可以允许建立拒绝/内插方案。

票数 0
EN

Stack Overflow用户

发布于 2014-12-12 08:22:16

QueryPerformanceCounter导致OAL内部的调用(BSP的一部分),其中系统中可用的最高分辨率累进计数器应该用来返回64位值。看上去是那个特定的BSP的问题。在x86上,HW计时器的数量是有限的,这可能是因为一些驱动程序正在使用QueryPerformanceCounter使用的计数器来获得小于1ms分辨率的计时器。它似乎是重新设置,然后继续增加,这可能是由于驱动程序为自己设置一个计时器(可能只使用较低的32位部分的定时器寄存器)。如果您有BSP的源代码,您可以搜索OEMQueryPerformanceCounter实现,检查寄存器正在使用,并检查BSP的其他组件是否正在访问它们(或者其他可能影响它们的操作性的寄存器)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27419223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档