11如何精确计算出一个算法的CPU运行时间?

http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=211457

 
你需要多精确?  
GetTickCount可以到18-20ms进度  
timeGetTime可以到1ms精度  
……  
 
当然这些都不是C  or  c++  标准支持的。  
 
那么就要祭出最牛奔的方法,  
直接读取CPU开机以来执行的机器周期数,  
一条汇编指令:RDTSC  (就是  ReaD  TimeStamp  Count)  
精度可以达到ns级别。(准确地说精度是1  /  你的CPU的时钟频率,这也是极限)  
 
 
 
             
           long  HighStart,LowStart,HighEnd,LowEnd;  
           long  numhigh,numlow;  
             
           __asm  
           {  
                       RDTSC    
                                   mov  HighStart,  edx  
                                   mov  LowStart,  eax              
                                     
//  put  your  time-consuming  code    here  ……  
                                   RDTSC  
                                   mov  HighEnd,  edx  
                                   mov  LowEnd,    eax  
                                   //获取两次计数器值得差  
                                   sub  eax,    LowStart  
                                   cmp        eax,    0                
                                   jg          L1  
                                   neg          eax    
                                   jmp          L2  
                                     
L1:                        mov  numlow,    eax  
L2:                        sbb  edx,    HighStart  
                       mov  numhigh,  edx  
                         
           }  
           __int64    timer  =(numhigh<<32)  +  numlow;  //得出最终结果  



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=562995

<script src="http://writeblog.csdn.net/PromoteIcon.aspx?Id=562995" type="text/javascript"></script> [ 点击此处收藏本文]   发表于 2005年12月27日 9:25 AM
href="http://blog.csdn.net/Purpleendurer/Services/Pingback.aspx" rel="pingback" /> <script type="text/javascript">function hide(){showComment();}</script>
<script type="text/javascript">document.write(" ");</script>

 

 
wzjall 发表于2006-01-02 10:10 PM  IP: 221.204.224.*
这样为什么会报错呢?
去掉下面的就没问题了,但要怎样
put my time-consuming code 呢?
int x=100000;
           while(x>0)
x--; 

#include <iostream.h>

void main()
{

long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow;

__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax

// put your time-consuming code here ……

int x=100000;
           while(x>0)
x--;  



RDTSC
mov HighEnd, edx
mov LowEnd, eax
//获取两次计数器值得差
sub eax, LowStart
cmp eax, 0
jg L1
neg eax
jmp L2

L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx

}
}

int timer =(numhigh<<32) + numlow; //得出最终结果

cout<<timer<<endl;


}



 
wzjall 发表于2006-01-02 10:15 PM  IP: 221.204.224.*
我的意思是去掉下面这三句.
int x=100000;
           while(x>0)
x--; 
-----------------------------
------------------------
__asm
{
//这里是不是只能放汇编代码呀?
}

 
purpleendurer 发表于2006-01-06 11:03 AM  IP: 218.65.243.*
》》去掉下面的就没问题了,但要怎样
》》put my time-consuming code 呢?

put my time-consuming code是告诉你那个位置是放我们的代码的地方


》》__asm
》》{
》》//这里是不是只能放汇编代码呀?
》》}

是的。这是内联汇编指令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值