http://blog.sina.com.cn/s/blog_4b957026010008cz.html
在MS VC++下实现微秒级精度定时
在MS VC++下实现微秒级精度定时
(2007-04-02 20:47:23)分类: 编程相关问题 |
要实现微秒级精度要用到下面两个函数:
BOOL QueryPerformanceFrequenc
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
编程时需要包含:Windows.h
上述两个函数的参数的数据类型LARGE_INTEGER既可以是一个8字节长的整型数,
也可以是两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而
定。该类型的定义如下:
typedef union _LARGE_INTEGER
{
struct{
DWORD LowPart ; // 4字节整型数
LONG HighPart ; // 4字节整型数
};
LONG QuadPart ; // 8字节整型数
} LARGE_INTEGER ;
1、首先调用QueryPerformanceFrequenc
2、在需要定时的代码的两端分别调用QueryPerformanceCounter()以取得高精度运行计数器的数值n1、n2,两次数值的差值通过f换算成时间间隔,t=(n2-n1)/f获得的t单位为秒.
实现微秒精度定时器:
LARGE_INTEGER PT_litmp;
LONGLONG
double
//(以上的LARGE_INTEGER 和LONGLONG数据结构你查msdn)
QueryPerformanceFrequenc
PT_dfFreq=(double)PT_litmp.QuadPart; //获得系统的主频
QueryPerformanceCounter(&PT_litmp);
PT_QPart1=PT_litmp.QuadPart;
do{
}while(PT_dfTim*1000000<1000);
VC++7.0下实现检测一个过程或函数耗费的时间:
LONGLONG
double
QueryPerformanceFrequenc
PT_dfFreq=(double)PT_litmp.QuadPart; //获得系统的主频
QueryPerformanceCounter(&PT_litmp);
//
//以下代码将时间转化为字符串并显示出来
char timestring[100];
sprintf(timestring,"%f ms",PT_dfTim);
timestring[99]='0';
ID3DXFont* font=0;
font->DrawText(NULL,timestring,-1,&rect,DT_LEFT,D3DCOLOR_ARGB(255,0,0,0));
===============================================================
添加一个生成随机文件名的函数
string randfilenamemaker(void)
{
LARGE_INTEGER PT_litmp;
LONGLONG PT_QPart1,PT_QPart2;
double PT_dfMinus,PT_dfFreq,PT_dfTim;
QueryPerformanceFrequency(&PT_litmp);
PT_dfFreq=(double)PT_litmp.QuadPart; //获得系统的主频
QueryPerformanceCounter(&PT_litmp);
PT_QPart1=PT_litmp.QuadPart; //获得起始的值
PT_dfMinus=(double)PT_QPart1;
PT_dfTim=PT_dfMinus/PT_dfFreq; //计算出程序运行的时间,单位s
PT_dfTim*=1000000; //换算为微秒
//PT_dfTim*=1000; //换算为毫秒
//PT_dfTim= (double)PT_QPart1;
char timestring[100]={0};
sprintf(timestring,"%fms",PT_dfTim);
strcat(timestring,".txt");
cout <<"timestring: "<< timestring<< endl;
// system("pause");
return timestring;
}