代码运行时间计算

1.GetTickCount函数

这个函数的作用是获取计算机的运行时间,从计算机启动算起。获取代码运行时间的一般的做法是,执行测试代码前获取一次,执行代码后获取一次,然后将两个时间相减,即为测试代码执行时间,单位是ms。

如果是远古时期单处理器批处理的计算机,这样完全没有问题。但现在的计算机大多是多处理器抢占式操作系统,这么做的话就会有误差。在计算测试代码运行时间的过程中,极有可能切换到别的线程去处理别的任务,最终计算出的结果就会偏大。所以这个函数只能用在误差要求不是很准确的地方。

2.GetThreadTimes和GetProcessTimes函数

这两个函数分别用来获取线程和进程的运行时间。其函数原型如下:

BOOL GetThreadTimes( HANDLE hThread, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime);

BOOL GetProcessTimes(HANDLE hProcess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,LPFILETIME lpKernelTime,LPFILETIME lpUserTime);
 
其中需要关注的是lpKernelTime和lpUserTime,分别是线程或者进程运行占用的内核时间和用户模式时间,这两个相加才是当前线程或者进程运行占用CPU的总时间。计算测试代码运行时间的流程一般是在运行前调用一次GetThreadTimes,运行后再调用一次,之后计算两次调用lpKernelTime和lpUserTime的差值,即为测试代码运行总时间。
 
这里边还有个问题,GetThreadTimes函数不太准确,如果单次运行(即每次占用CPU时间)少于15ms,有可能不计数,所以这个计算出来的值偏小,计数的概率大约在0.61左右。
 

3.QueryPerformanceCounter函数

QueryPerformanceCounter函数计算的精度是us,理论上讲,即便是多处理器多线程同时操作,误差也不是特别大。
相关函数如下:
 

 BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency );                          // 获取CPU频率

 BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount );                // 获取当前CPU计算值

流程同上边一样,实例代码如下:

  LARGE_INTEGER i64Frequency;
 if(!QueryPerformanceFrequency(&i64Frequency))
 {
  CString str;
  str.Format("Get CPU Frequency Is Error : %ld",GetLastError());
  AfxMessageBox(str);
 }
 LARGE_INTEGER i64CountStart;
 if(!QueryPerformanceCounter(&i64CountStart))
 {
  CString str;
  str.Format("Get CPU Count Start Is Error : %ld",GetLastError());
  AfxMessageBox(str);
 }

 Sleep(100);

 LARGE_INTEGER i64CountEnd;
 if(!QueryPerformanceCounter(&i64CountEnd))
 {
  CString str;
  str.Format("Get CPU Count End Is Error : %ld",GetLastError());
  AfxMessageBox(str);
 }

 __int64 i64MSCount = (i64CountEnd.QuadPart - i64CountStart.QuadPart) * 1.0 / i64Frequency.QuadPart * 1000;

 CString str;
 str.Format("%ld",i64MSCount);
 AfxMessageBox(str);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值