A-A+

QueryPerformanceFrequency函数和LARGE_INTEGER类型

2014年12月04日 C++函数 暂无评论 阅读 183 次

QueryPerformanceFrequency函数和LARGE_INTEGER类型

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

LARGE_INTEGER结构:

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

示例:

#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官方]

标签:

给我留言

Copyright © C/C++程序员之家 保留所有权利.   Theme  Ality 浙ICP备15011757号-3

用户登录