WEB开发网
开发学院软件开发VC 探讨性能测试中的计时问题 阅读

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

 2010-08-15 20:47:50 来源:WEB开发网   
核心提示:在系统测试时,尤其在需要测试算法或者某些模块的运行时间时,探讨性能测试中的计时问题,往往需要调 用一些时间函数库(如VC中的timeGetTime等可以获取毫秒级的时间),在待测试 的模块前后分别测试时间,然后在需 要计时的模块前后分别调用QueryPerformanceCounter()函数,利用两次获得的计 数之差

在系统测试时,尤其在需要测试算法或者某些模块的运行时间时,往往需要调 用一些时间函数库(如VC中的timeGetTime等可以获取毫秒级的时间),在待测试 的模块前后分别测试时间,然后,计算前后两个时间的差值,就得到模块的运行 时间,如图 1。

图 1 一个典型的模块计时方法

但是,使用原始的计时函数直接进行时间测试 在很多复杂情况下不方便,如图 1,当在一个模块中有多个子模块需要分别计时 ,所编写的计时代码甚至比原有的代码还多,这增加了程序维护和阅读的难度, 容易出错。作者结合自己在相关工作中的经验,封装了一组计时函数,共享给大 家。该组函数有如下几个优点:

计时精确:封装的是高精度的计时API函 数QueryPerformanceCounter(),该函数根据硬件定时器的频率,理论上可以得到 微秒(us)级精度的计时结果;

使用简单:只用在待测试的模块前后加上两 个宏BM_START和BM_END,不需要对结果进行计算,也不需要考虑对各个模块测试 结果数据的维护,这些操作已经被封装。

结果输出独立:在系统运行结果 时,只需要调用一个函数就可以把计时结果保存在一个文本文件里,如图 5和图 8所示。

1. 高精度计时函数

在Windows系统下,程序员通常可以使 用多种方式来进行时间控制:如使用前文提到的timeGetTime()函数,或者使用 GetTickCount()函数,又或实现WM_TIMER消息的映射等等。但是这些方法得到的 时间精度都有一定的局限性,为了增加下文将到介绍的计时函数库的适用性,本 文采用高精度的时控API函数QueryPerformanceCounter()。

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

图 2 精确计时代码段

1 2 3 4 5  下一页

Tags:探讨 性能

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接