QueryPerformanceFrequency函数和LARGE_INTEGER类型

QueryPerformanceFrequency函数和LARGE_INTEGER类型

QueryPerformanceFrequency函数和LARGE_INTEGER类型

  • 说明一:QueryPerformanceFrequency和QueryPerformanceCounter()一起计算出精确时间。QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率,QueryPerformanceCounter()函数用于得到高精度计时器的值(如果存在这样的计时器),如果不支持返回值为0。
  • 说明二:LARGE_INTEGER结构实际上是一个联合。如果你的编译器具有内置支持64位整数,使用QuadPart成员中存储的64位整数。否则,使用LowPart和HighPart成员的存储的64位整数。

LARGE_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)的精确持续时间方法:

示例:

结果:WwW.Cplusplus.me Time:1.99027

参考资料:[百度知道] [MSDN官方]