VC++通过汇编获取代码运行时间

wangwei198892

wangwei198892

2016-02-19 14:25

下面图老师小编要跟大家分享VC++通过汇编获取代码运行时间,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

     如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具,确实,不过你也可以在程序中嵌入汇编代码来实现。

     在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值,我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数,进而通过你的cpu的频率算出一个时钟周期的时间,从而算出程序运行的确切时间。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

    我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.

    下面看看实现的代码:


 //用汇编实现获取一段代码运行的时间
#includeiostream

using namespace std;

void GetClockNumber (long high, long low);
void GetRunTime();
 
int main()
{      
 
 long HighStart,LowStart,HighEnd,LowEnd;
 long numhigh,numlow;
 //获取代码运行开始时cpu内部计数器的值
 __asm             
 {
  RDTSC
  mov HighStart, edx
  mov LowStart, eax
 }
 for(int i= 0; i100000; i++ )
 {
             for(int i= 0; i100000; i++ )
      {
      
      }
 }
 

  //获取代码结束时cpu内部计数器的值,并减去初值
        __asm
 {
  RDTSC
  mov HighEnd, edx
  Mov LowEnd,  eax
  ;获取两次计数器值得差
  sub eax,  LowStart
  cmp    eax,  0       ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
  jg     L1
  neg     eax
  jmp     L2
            L1: mov numlow,  eax
            L2: sbb edx,  HighStart
  mov numhigh, edx
 
 }
        //把两个计数器值之差放在一个64位的整形变量中
        //先把高32位左移32位放在64的整形变量中,然后再加上低32位
 __int64  timer =(numhigh32) + numlow;
         //输出代码段运行的时钟周期数
         //以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上  ^_^
 cout (double) (timer /1.1/1000000000)  endl;
 return 0;
}

     这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间,不过并不能得到运行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间,

因为在第一次取得计数器的值后,有两条汇编指令mov HighStart, edx       mov LowStart, eax这两条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间(在1.1G的机子上是3e-8s),这样会更精确一点。

    如果你要确切知道程序的运行时间,专业的测试软件肯定会更好一点,不过好像一般没有必要获取除非专门的要求的程序。

    不过能DIY一个也是不错的,不管有没有,最起码你可以学到在VC++中如何嵌入汇编代码以及如何使用32位的寄存器,其实和16位的寄存器一样使用,将来64的也应该一样,只不过位数不同罢了。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

VC++通过汇编获取代码运行时间

编程语言 网络编程 汇编语言
VC++通过汇编获取代码运行时间

JScript 运行时错误

编程语言 网络编程
JScript 运行时错误

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

运行时生成控件

Delphi
运行时生成控件

怎样通过任务管理器查看win7系统运行时间

电脑网络
怎样通过任务管理器查看win7系统运行时间

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Mac OS X电脑运行时间如何查询?

电脑入门
Mac OS X电脑运行时间如何查询?

IE浏览器如何解决运行时间错误

浏览器
IE浏览器如何解决运行时间错误

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何才能在QQ空间显示可能认识的人模块?

如何才能在QQ空间显示可能认识的人模块?

窗口类的诞生(注册自己的窗口类)1

窗口类的诞生(注册自己的窗口类)1
下拉加载更多内容 ↓