这坑人的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**要精确