代码执行时间的计算在以下场合需要用到:
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