探讨性能测试中的计时问题
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)其中参数iModel表示当前计时的模块序号,0<=iModel<=BENCHMARK_MAX_COUNT;为了简化调用代码,我们给出一个宏定义如下:
{
LARGE_INTEGER litmp;
QueryPerformanceCounter(&litmp);
gStarts[iModel] = litmp.QuadPart;
}#define BM_START(t) BMTimerStart(t);2.4. 终止计时BMTimerEnd()
来源:vckbase 作者:龚 勋 责编:豆豆技术应用
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……