加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用QueryPerformanceCounter()向后运行的时间

发布时间:2020-12-16 07:10:26 所属栏目:百科 来源:网络整理
导读:我在 this post中找到了有关QueryPerformanceCounter使用的有用信息,但我遇到了一个我没有找到答案的问题. 我正在开发一个Windows CE 6.0应用程序,需要GetTickCount可以提供更好的分辨率.这就是我选择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频率.

解决方法

Counter Value: 6536266821

Counter Value: 6536266262

Counter Value: 6536266604

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

您还应该提供有关硬件的更多详细信息.性能计数器使用了什么资源? Acquiring high-resolution time stamps可以帮助您获得更详细的视图.

考虑到循环的线性行为,您可以绘制值与时间的关系图.这可能会使问题特别突出.它还可以允许建立拒绝/插值方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读