探讨性能测试中的计时问题
2010-08-15 20:47:50 来源:WEB开发网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()
终止计时函数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中最后一行代码所示。由于篇幅限制,具体实现代码请参考源程序。
更多精彩
赞助商链接