QueryPerformanceFrequency函数和LARGE_INTEGER类型
QueryPerformanceFrequency函数和LARGE_INTEGER类型
- 说明一:QueryPerformanceFrequency和QueryPerformanceCounter()一起计算出精确时间。QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率,QueryPerformanceCounter()函数用于得到高精度计时器的值(如果存在这样的计时器),如果不支持返回值为0。
- 说明二:LARGE_INTEGER结构实际上是一个联合。如果你的编译器具有内置支持64位整数,使用QuadPart成员中存储的64位整数。否则,使用LowPart和HighPart成员的存储的64位整数。
LARGE_INTEGER结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
typedef union _LARGE_INTEGER { struct { DWORD LowPart; LONG HighPart; } DUMMYSTRUCTNAME; struct { DWORD LowPart; LONG HighPart; } u; LONGLONG QuadPart; } LARGE_INTEGER, *PLARGE_INTEGER; |
LARGE_INTEGER成员:
- LowPart 低32位。
- HighPart 高32位。
- QuadPart 有符号的64位整数。
关于LARGE_INTEGER里面的U和DUMMYSTRUCTNAME:
其实并没有什么好解释的,这里面有好多历史性的原因。很早以前就有这个union了,以前也没有匿名struct的概念。
以前得这样访问高位 LARGE_INTEGER.u.HighPart,中间多了个u,这会很麻烦,后面有了匿名struct的概念,就可以直接 LARGE_INTEGER.HighPart
这样访问了,但为了向前兼容,微软不能把u去掉,因为有代码还有它(来自于百度知道)。DUMMYSTRUCTNAME是匿名结构体,多年前,使用匿名结构体需要声明变量。
用法:在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。测试函数SLEEP(1000)的精确持续时间方法:
示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> #include "windows.h" int main(int argc,char *argv[]) { LARGE_INTEGER Cplusplus_me,Start,End; QueryPerformanceFrequency(&Cplusplus_me); // 获取计数器的时钟频率 QueryPerformanceCounter(&Start); // 开始的计数 Sleep(2000); // 睡眠1000毫秒 QueryPerformanceCounter(&End); //结束的计数 std::cout<<"WwW.Cplusplus.me Time:"<<(double)(End.QuadPart-Start.QuadPart)/Cplusplus_me.QuadPart<<std::endl; return 0; } |
结果:WwW.Cplusplus.me Time:1.99027
参考资料:[百度知道] [MSDN官方]