在MS VC++下实现微秒级精度定时

http://blog.sina.com.cn/s/blog_4b957026010008cz.html


在MS VC++下实现微秒级精度定时


在MS VC++下实现微秒级精度定时

  (2007-04-02 20:47:23)
  分类: 编程相关问题

 
要实现微秒级精度要用到下面两个函数:

BOOL QueryPerformanceFrequency (LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
编程时需要包含:Windows.h    Kernel32.lib


  上述两个函数的参数的数据类型LARGE_INTEGER既可以是一个8字节长的整型数,

也可以是两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而

定。该类型的定义如下:

typedef union _LARGE_INTEGER
{
 struct{
  DWORD LowPart ; // 4字节整型数
  LONG HighPart ; // 4字节整型数
 };
 LONG QuadPart ; // 8字节整型数
} LARGE_INTEGER ;


1、首先调用QueryPerformanceFrequency()函数取得高精度运行计数器的频率f,单位是每秒多少次(n/s),此数一般很大;

2、在需要定时的代码的两端分别调用QueryPerformanceCounter()以取得高精度运行计数器的数值n1、n2,两次数值的差值通过f换算成时间间隔,t=(n2-n1)/f获得的t单位为秒.

实现微秒精度定时器:

LARGE_INTEGER PT_litmp;
LONGLONG      PT_QPart1,PT_QPart2;
double        PT_dfMinus,PT_dfFreq,PT_dfTim;
//(以上的LARGE_INTEGER 和LONGLONG数据结构你查msdn)
QueryPerformanceFrequency(&PT_litmp);
PT_dfFreq=(double)PT_litmp.QuadPart; //获得系统的主频
QueryPerformanceCounter(&PT_litmp);
PT_QPart1=PT_litmp.QuadPart;        //获得起始的值
do{
    QueryPerformanceCounter(&PT_litmp);
    PT_QPart2=PT_litmp.QuadPart;    //获得结束计数
    PT_dfMinus=(double)(PT_QPart2-PT_QPart1);
    PT_dfTim=PT_dfMinus/PT_dfFreq; //计算出程序运行的时间,单位s
}while(PT_dfTim*1000000<1000);  //当程序运行到1000微s时退出while循环


VC++7.0下实现检测一个过程或函数耗费的时间:

 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;     //获得起始的值

 //这里添加要检测耗时多少的过程

    QueryPerformanceCounter(&PT_litmp);
    PT_QPart2=PT_litmp.QuadPart;    //获得结束计数
    PT_dfMinus=(double)(PT_QPart2-PT_QPart1);
    PT_dfTim=PT_dfMinus/PT_dfFreq;  //计算出程序运行的时间,单位s
    PT_dfTim*=1000;   //换算为毫秒
//  PT_dfTim*=1000000;//换算为微秒

//以下代码将时间转化为字符串并显示出来
char timestring[100];
sprintf(timestring,"%f ms",PT_dfTim);
timestring[99]='0';

ID3DXFont* font=0;
 D3DXFONT_DESC lf;
 ZeroMemory(&lf,sizeof(D3DXFONT_DESC));
 lf.Height=25;
 lf.Weight=12;
 lf.Weight=500;
 lf.Italic=false;


 lf.CharSet=DEFAULT_CHARSET;
 strcpy(lf.FaceName,"Times New Roman");
 

 D3DXCreateFontIndirect(Device,&lf,&font);
  RECT rect;
  rect.top=0;
  rect.left=0;
  rect.bottom=20;
  rect.right=500;

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;


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值