在进行代码优化的时候,我们需要用计时函数找出最应该做优化的地方,即好刀用在好刃上。在VS.C++程序中,以下函数能计算出程序运行的时间:
//定义变量
LARGE_INTEGER litmp;
LONGLONG QPart1;
LONGLONG QPart2;
double dfMinus;
double dfFreq;
double dfTim;
// 获得计数器的时钟频率
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;
// 获得初始值
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;
//需要测试的函数MyFunction();如Sleep(10);
Sleep(10);
// 获得终值
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;
//运行时间即为终值与初值之差,然后再除以时钟频率
dfMinus = (double)(QPart2 - QPart1);
dfTim = dfMinus / dfFreq;
//将它换算成微秒级
dfTim =* 1000000;
上述中出现的二个函数QueryPerformanceCounter(); QueryPerformanceFrequency();的头文件为windows.h。其精度取决于硬件高精度计时器的频率,一般来讲,精度还是远远够了的,微秒级轻而易举。对这两个函数的具体说明可以查找MSDN。
我们看到,对于一个小小的测试计时程序,其代码量就如此之多,对于仅有一个需要测试的时候,复制和粘贴还是so easy,但如果需要测试100个呢?以下函数试图改进此问题:
int QueryEllapsedTime(int mode)
{
static LARGE_INTEGER litmp;
static LONGLONG QPart1;
static LONGLONG QPart2;
static double dfMinus;
static double dfFreq;
static double dfTim;
if (0 == mode)
{
QueryPerformanceFrequency(&litmp); // 获得计数器的时钟频率
dfFreq = (double)litmp.QuadPart; // 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart; // 获得初始值
}
else
{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart; //获得中止值
dfMinus = (double)(QPart2 - QPart1);
dfTim = dfMinus / dfFreq;
}
return int(dfTim * 1000000);
}
当我们再需要对程序进行计时测试时,可以如下编写代码:
QueryEllapsedTime(0);
Sleep(10);
int time = QueryEllapsedTime(1);
编程的界面一目了然!