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

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

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

  终止计时函数BMTimerEnd()放在计时模块的结束,函数定义如下:void BMTimerEnd(int iModel)
{   
     LARGE_INTEGER litmp;
     QueryPerformanceCounter(&litmp);
     gEnds[iModel] = litmp.QuadPart;
     gCounters[iModel] += (((gEnds[iModel] - gStarts[iModel]) / dfFreq) * 1000000);
}

  参数iModel同BMTimerStart()。本函数首先获取当前的时钟数,然后除以dfFreq得到运行时间。对于最后一条语句:

  gCounters[iModel] += (((gEnds[iModel] - gStarts[iModel]) / dfFreq) * 1000000);

  要注意两点:

  用“+=”而不是“=”,这个看似简单的代替,可以实现对同一个模块的重复计时,后文3.3节列举的情况;

  乘以1000000,表示计时单位为微秒(us)。

  类似BMTimerStart(),同样为BMTimerEnd()定义一个宏:

#define BM_END(t)       BMTimerEnd(t);

  2.5. 结果输出WriteData()

  以一个文本文件(见图 5和图 8)把全局变量gCounters中的所有值输出,该函数一般在程序结束处调用,如图 4中最后一行代码所示。由于篇幅限制,具体实现代码请参考源程序。

  3. 计时测试实例

  3.1. 多个模块计时

  图 3展示了嵌套计时以及对一个函数中多个模块进行计时的代码,图中可以看到,利用输入参数我们对计时模块进行统一编号,测试代码相对图 1更清晰、直观。

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

  图 3 用我们的函数实现嵌套计时

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

正在加载评论...