探讨性能测试中的计时问题

http://tech.ddvip.com   2007年12月30日    社区交流

内容摘要:本文结合作者在代码性能测试工作中的经验,介绍一组自己封装的的计时函数。使用该组函数可以简化测试工作,从而把更多的精力放在主要工作上,不需要过多地维护计时代码,仅仅使用两个宏就可以方便、精确地实现多个模块、多方式的时间性能测试,并且计时结果以一个文本文件独立保存,清晰直观。

  计时之前,调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,然后在需要计时的模块前后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差获得时钟频率,计算出模块的运行时间。代码如图 2:

探讨性能测试中的计时问题

  图 2 精确计时代码段

  2. 封装计时函数

  2.1. 数据结构

  为了维护计时结果,我们定义如下几个数据:

#define BENCHMARK_MAX_COUNT 20
double gStarts[BENCHMARK_MAX_COUNT];
double gEnds[BENCHMARK_MAX_COUNT];
double gCounters[BENCHMARK_MAX_COUNT];
double dfFreq = 1;

  其中,BENCHMARK_MAX_COUNT定义了需要计时的模块总数,20表示最多可以定时20个模块,该值可以根据具体应用而定。gStarts和gEnds分别用于保存开始计时和终止计时的计数器的值,gCounters用来保存计时结果。全局变量dfFreq用来保存上文介绍的时钟频率,如图 2所示。

  2.2. 初始化InitBenchmark()

  初始化函数InitBenchmark()包括两部分内容:

  对数组gStarts, gEnds, gCounter清零;

  获得机器内部定时器时钟频率。

  InitBenchmark()代码如下所示:void InitBenchmark()
{
     ResetBenchmarkCounters();
     GetClockFrequent();
}

  该函数一般在程序运行最初调用。

  2.3. 开始计时BMTimerStart()

  开始计时函数BMTimerStart()放在计时模块的开始,函数定义如下:

void BMTimerStart(int iModel)
{
     LARGE_INTEGER litmp;
     QueryPerformanceCounter(&litmp);
     gStarts[iModel] = litmp.QuadPart;
}
其中参数iModel表示当前计时的模块序号,0<=iModel<=BENCHMARK_MAX_COUNT;为了简化调用代码,我们给出一个宏定义如下:#define BM_START(t)         BMTimerStart(t);2.4. 终止计时BMTimerEnd()

来源:vckbase    作者:龚 勋    责编:豆豆技术应用

正在加载评论...