软件性能计时

在单元测试中,有一部分的内容就是计算各个函数计算时间,这样可以知道性能瓶颈在哪里。所以,如何对软件进行性能计时一直是我关注的一个话题。就我目前的认知来说,不同的环境对软件性能其实要求是不一样的,所以有的软件可能是秒级,有的是毫秒级的,而有的则是cpu周期级别的。下面,我们就可以一一开始介绍了。


(1)秒级

    利用秒对软件进行度量其实是很少的,但是它可以为我们提供一种基本的思路。在软件计算前,我们计算当前的基本时间,在服务结束后,我们再计算一下当前的时间,中间的差值就是实际运行的时间。所用的基本函数就是_strtime,


(2)毫秒

    对于绝大多数软件来说,可以通过毫秒函数获得实际业务运行的时间。对于vxWorks操作系统来说,这个函数是tickGet,而在windows系统里面,这个函数是GetTickCount,使用起来的都非常得方便。


(3)时钟周期

    就像前面说过的,毫秒级的度量对于大多数函数来说足够了。但是对于系统级别的应用,特别是在系统切换的度量上面,考虑实际指令究竟花费了多长时间,毫秒级的函数肯定不好使了。在intel芯片上就存在这样的指令,即为rdtsc。调用了这个指令,对应的指令周期就可以保存下来。整个周期数值是一个64位数,高位记录在edx,低位记录在eax。


(4)多核时钟周期

    前面说到的时钟周期计算基本上都是建立在单核的领域,但是现在很多电脑配置都是多核的cpu处理器,而且对于不同core的cpu来说,不同的cpu其实它的时钟周期是不一样的,所以这里就涉及到如果对多核的cpu进行周期计算的问题。好在windows已经为我们考虑到了这个问题,我们可以通过设置SetThreadAffinityMask这个函数帮我们把线程绑定在某一个cpu之上,这样就不会有什么差错了。编写完程序之后,大家可以通过taskmgr程序看看结果,就会有不一样的认识。
 


示例代码:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <windows.h>  
  3.   
  4. void test1()  
  5. {  
  6.     unsigned int lower;  
  7.     unsigned int higher;  
  8.   
  9.     __asm  
  10.     {  
  11.         push eax  
  12.         push edx  
  13.         rdtsc  
  14.         mov lower, eax  
  15.         mov higher, edx  
  16.         pop edx  
  17.         pop eax  
  18.     }  
  19.   
  20.     printf("cpu cycle = 0x%08x%08x\n", higher, lower);  
  21. }  
  22. void test2()  
  23. {  
  24.     unsigned int before;  
  25.     unsigned int after;  
  26.   
  27.     __asm  
  28.     {  
  29.         push eax  
  30.         rdtsc  
  31.         mov before, eax  
  32.         rdtsc  
  33.         mov after, eax  
  34.         pop eax  
  35.     }  
  36.   
  37.     printf("single instuct time = 0x%08x\n", after - before);  
  38. }  
  39.   
  40. int main(int argc, char* argv[])  
  41. {  
  42.     char buffer[16];  
  43.     int value;  
  44.   
  45.     SetThreadAffinityMask(GetCurrentThread(), 2);     
  46.     _strtime(buffer);  
  47.     printf("%s\n",buffer);  
  48.   
  49.     value = GetTickCount();  
  50.     printf("interval = %d\n", GetTickCount() - value);  
  51.   
  52.     test1();  
  53.     test2();  
  54.     return 1;  
  55. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值