c – 使用QueryPerformanceCounter()向后运行的时间
我在
this post中找到了有关QueryPerformanceCounter使用的有用信息,但我遇到了一个我没有找到答案的问题.
我正在开发一个Windows CE 6.0应用程序,需要GetTickCount可以提供更好的分辨率.这就是我选择QueryPerformanceCounter函数的原因. 我观察到我得到的计数器值来回传递.虽然这不是最终的应用,但这个小例子说明了这个问题: 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)中执行类型操作并且在相同情况下找到负时间间隔. 我已阅读(here)使用多核平台时可以找到此问题.但是,情况并非如此,因为Windows CE 6.0不支持多核处理. 任何帮助找到这种情况发生的原因和/或任何解决方法,以避免这个问题将不胜感激. [编辑] 我编辑问题以包含更多信息: 较长的连续读取列表(与上面的列表不同): 专柜价值:15234261579 专柜价值:15234261594 专柜价值:15234261609 专柜价值:15234261624 专柜价值:15234261640 专柜价值:15234261064 专柜价值:15234261079 专柜价值:15234261094 专柜价值:15234261109 专柜价值:15234261125 专柜价值:15234261140 专柜价值:15234261155 专柜价值:15234261170 专柜价值:15234261185 专柜价值:15234261201 专柜价值:15234261216 专柜价值:15234261231 专柜价值:15234261246 关于硬件,正在使用Intel Celeron 1047UE处理器和HM76芯片组. 调用QueryPerformanceFrequency时,读取1.19MHz频率. 解决方法
即使是第三次阅读也比第一次要小!但这里的相关性是什么?您应该使用QueryPerformanceFrequency()来读取性能计数器频率,以研究几百个计数的差异实际意味着什么.频率在MHz范围内,这仍然比毫秒好很多.你能提供更长的QueryPerformanceCounter()连续读取列表吗? 您还应该提供有关硬件的更多详细信息.性能计数器使用了什么资源? Acquiring high-resolution time stamps可以帮助您获得更详细的视图. 考虑到循环的线性行为,您可以绘制值与时间的关系图.这可能会使问题特别突出.它还可以允许建立拒绝/插值方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |