计算代码运行时间

代码执行时间的计算在以下场合需要用到:

1、代码出现运行瓶颈,需要找到瓶颈所在。

2、程序运行一段时间以后变慢,需要找到变慢的代码。

 

出于以上目的,你或许可以使用代码时间测试工具(如Rational Quantify)。但,这些工具可能运行速度太慢,让你心烦。

而且,Release给客户的程序,有时会出现以上问题,这时你不可能还用Rational Quantify来运行程序。

 

那怎么办呢?

答案当然是:自己编写计算代码运行时间的程序。

 

但首先要把握一个原则:计算时间的代码不能影响原来程序的运行速度。(有时,一些程序员为了计算某段代码的时间,会在代码

之前获得系统时间,然后在之后又获取系统时间,最后相减得到时间差,并写入文件。结果发现被测试的程序相当的慢,根本就不能运行。)

 

所以,最好的解决方法是:把时间运算信息放到缓冲,然后创建另外一个线程来读取这些缓冲信息,并计算时间差写入文件。

 

本人综合以上原理,自己开发了一个动态库,接口函数如下:

extern _DS_EXT_DSDEBUG_CLASS void InitWzTrace(int nBufferSize);
extern _DS_EXT_DSDEBUG_CLASS void UnInitWzTrace();

extern _DS_EXT_DSDEBUG_CLASS void BeginCalcTime(DWORD dwAddressCode, char *pszNameAddress = NULL);
extern _DS_EXT_DSDEBUG_CLASS void EndCalcTime(DWORD dwAddressCode, char *pszNameAddress = NULL);

#define GETCODEADDR(ADDR, POS) __asm{POS:  LEA   EAX, POS}/
                               __asm{MOV   ADDR, EAX};

static void _declspec(naked)GetEIP()
{
 __asm
 {
  pop eax
  push eax 
  ret
 };
}

#define GETEIP(ADDR) __asm{push eax}/
 __asm{call GetEIP}/
 __asm{mov ADDR, eax}/
 __asm{pop eax}/

 

 

 

 

如,

void Fun()

{

  DWORD dwAddr;

  GETEIP(dwAddr)  //获得当前代码指令地址

 BeginCalcTime(dwAddr, "Fun"); //代码根据当前代码指令地址来识别不同的测试代码段

Sleep(1000);

EndCalcTime(dwAddr);//测试代码结束测试;

 

 

}

void main()

{

InitWzTrace(2000);//初始化

Fun();

UnInitWzTrace();//反初始化

 

}

 

 

需要源代码的,可以联系我,QQ:363169978

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值