首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这坑人的API,根本就不精确,该怎么解决

2012-05-22 
这坑人的API,根本就不精确好不容易才找到GetSystemTimeAsFileTime 这个API 用来获取精确时间VOID GetSyste

这坑人的API,根本就不精确
好不容易才找到 GetSystemTimeAsFileTime 这个API 用来获取精确时间

VOID GetSystemTimeAsFileTime(
  LPFILETIME lpSystemTimeAsFileTime // pointer to a file time  
  // structure
);

FILETIME
The FILETIME structure is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601. 

看到可以获取精度到百纳秒就高兴急了,可以实现我的微妙检测。

结果坑死我了。

我用下面代码测试:

C/C++ code
    FILETIME t1, t2;    LARGE_INTEGER i1, i2;    GetSystemTimeAsFileTime(&t1);    i1.LowPart  = t1.dwLowDateTime;    i1.HighPart = t1.dwHighDateTime;    for (int i = 0, N = 6000000; i < N; ++i)        ;    GetSystemTimeAsFileTime(&t2);    i2.LowPart  = t2.dwLowDateTime;    i2.HighPart = t2.dwHighDateTime;    int t = i2.QuadPart - i1.QuadPart;


本来以为t会比较小, N值从1000一直开始加,到5000000都是0,刚换6000000就猛的变成156250,15.625毫秒。

不说个位级别的微妙了,就连各位级别的毫秒都看不到。

完全不明白怎么回事。。。。。。。。。。。

然后又这样换了,进行测试:
C/C++ code
    long long t1, t2;    t1 = GetTickCount();    while(true)    {        if ((t2 = GetTickCount()) - t1 > 0)        {            cout << t2  - t1 << endl;            t1 = t2;        }    }

本来以为至少可以看到个位级别的毫秒。

但是最小单位就固死了是15和16毫秒, 一直输出15或16.

感觉,系统能取到的最小时间精度就是15或16毫秒了。。。


这是怎么回事啊。我晕啊··

看来获取当前时间精确到微妙是不可能了。

但是一个时间间隔精确到微妙应该没问题,因为还有QueryPerformanceCounter 和 QueryPerformanceFrequency


唉。。。。。感觉好坑~~~



[解决办法]
精确是理想,不精确是现实。
[解决办法]
windows API计时最准的是QueryPerformanceCounter,CPU计时的

其他任何时间函数都是用操作系统时间片计时,多核下Windows的时间片是15毫秒,单核10毫秒,决定了你的最高精度10-15毫秒
[解决办法]
timeBeginPeriod可以改变时钟中断频率,因此影响GetSystemTimeAsFileTime ,Sleep,WaitFor..的精度
QueryPerformanceCounter会使用配备的精度比较高的计数器,比如我这里它使用rdtsc
win32就是一套api的名字,也指一个子系统,64位里面还叫win32
[解决办法]
刚才看了一下源代码,GetSystemTime**所读取的USER_SHARED_DATA.SystemTime不是每次时钟中断都更新,而是等中断时长积累到KeMaximumIncrement这么多才更新一次,而timeGetTime读取的USER_SHARED_DATA.InterruptTime倒是每次时钟中断都更新一次,所以timeGetTime比GetSystemTime**要精确

热点排行