找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: Youth

[求助] ACE_High_Res_Timer的问题,用了后定时器会不准

[复制链接]
发表于 2009-12-31 16:00:07 | 显示全部楼层
如果是QueryPerformanceFrequency的问题的话,可能linux下就不会有这个问题
发表于 2010-1-3 17:35:42 | 显示全部楼层
原帖由 wishel 于 2009-12-31 16:00 发表
如果是QueryPerformanceFrequency的问题的话,可能linux下就不会有这个问题

3楼就是linux系统,果然没有问题。
 楼主| 发表于 2010-1-6 15:23:56 | 显示全部楼层
反正我最后是放弃使用ACE_High_Res_Timer了。。。

当时的分析参见:http://yin-gang.spaces.live.com/ ... CCD70454!1215.entry
原帖由 wishel 于 2009-12-31 15:58 发表
正好我也遇到这样的一个问题。。
看了下代码,在win32下是用BOOL QueryPerformanceCounter( LARGE_INTEGER *lpFrequency );来计算当前时间的。猜测是这个函数在多核情况下不准确。

整理简洁后的代码流程大致如下:
ACE_ ...
发表于 2010-1-6 16:28:12 | 显示全部楼层
这篇帖子我恰之前也看过和我实测的结果差不多,
同样暂时在代码里去掉了ACE_High_Res_Timer,
最近实在是比较忙没时间具体研究问题到底出在哪。
我也认为问题可能出在windows的API接口上
 楼主| 发表于 2010-4-13 14:45:30 | 显示全部楼层
我现在5.7.1的基础上应用了下边页面里提供的补丁代码(计算时间的时候使用64位整数代替原来的32位整数,避免了产生偏差的除法操作),问题基本解决,至少不会有16%的偏差了。。。:lol

http://bugzilla.dre.vanderbilt.edu/show_bug.cgi?id=3703
发表于 2010-4-16 16:02:15 | 显示全部楼层
我按照补丁上的用法,重编ACE测试了一下,貌似没有得到本质的解决。
%16的差异本质在于QueryPerformanceFrequency()
在不同的机器硬件架构上或者操作系统取出的值是不一样的。
我在不同的机器上测试过。
在我的机器取出来的是3579545
而在另一部分机器架构下取出来的是3579545000
而ACE_High_Res_Timer::global_scale_factor的获得是缘于
LARGE_INTEGER freq;
if (::QueryPerformanceFrequency (&freq))freq.QuadPart / ACE_HR_SCALE_CONVERSION

ACE_HR_SCALE_CONVERSION的定义是1000000

简单算一下就知道我机器上16%的误差是怎么出来的了。
0.597/3.579 ~=0.16,恰好是除法操作丢掉的部分,
而在另一些取出10位数的机器架构上,我拿相同的测试程序测试过ACE_High_Res_Timer是比较准确的。

[ 本帖最后由 modern 于 2010-4-16 16:04 编辑 ]
 楼主| 发表于 2010-4-18 22:08:20 | 显示全部楼层
但我看那个补丁修改的代码应该是直接就避免了除以ACE_HR_SCALE_CONVERSION的操作啊?(ACE_UINT64
ACE_High_Res_Timer::global_scale_factor (void))

另外,我的机器应该也是3579545。

[ 本帖最后由 Youth 于 2010-4-18 22:10 编辑 ]
发表于 2010-4-19 12:56:39 | 显示全部楼层
我被骗了!!
这个bug在svn89482被修了。
然后紧接着在svn89483被回滚了,因为下面的原因
Reverted change below, it breaks unix builds
我之前checkout最新的版本编译的,晕。

我checkout89482版本,编译跑了一下,
发现确实16%的偏差已经没有了,
不过大约30-40秒就仍然慢千万之一秒,
目测亦是还是比较明显的。

另,个别情况下,还在错误的时间触发。
发表于 2010-4-19 12:58:15 | 显示全部楼层
看了svn89483的代码,
确实是避免了使用ACE_HR_SCALE_CONVERSION进行除操作产生的精度的大幅丢失。
不过测试结果还是不太理想。楼上测试的结果如何?

按照作者的解释,我理解应该是完全解决了才对.
I changed the high-resolution timer class to add support for
native 64-bit calculations - which are supported by a vast
majority of Windows machines nowadays. The loss of precision
that resulted from the 32-bit arithmetic is therefore gone.

[ 本帖最后由 modern 于 2010-4-19 13:13 编辑 ]
 楼主| 发表于 2010-4-19 14:36:39 | 显示全部楼层
没有太精确地去测试过。。。:)

我现在项目里对定时器的主要要求是:基本准确(原来的16%太不可接受了)&基本不受系统时间变动影响(现在简单试下来还是有影响的,但影响不大)。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 13:19 , Processed in 0.026876 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表