关闭

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

发表于:2012-2-16 11:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:龚勋    来源:51Testing软件测试网采编

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

  在系统测试时,尤其在需要测试算法或者某些模块的运行时间时,往往需要调用一些时间函数库(如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 精确计时代码段

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号