for 循环嵌套性能的比较

有人对着汇编语言不够一屑,认为那已经是古老的低级语言,是当今的非主流语言,学了也不知道有什么用。是的,我们不得不承认,作为一门古老的语言,汇编已经完成了历史赋予它的使命,但是我们知道,我们现在所使用的任何高级语言在编译的时候都是被转化为汇编语言来执行的,也就是说,无论我们在上层做了何种的抽象,引入了多少新鲜的概念,作为一个程序员,我们的程序在最底层仍然是它,或许绝大部分的时间,我们无需关心它的存在,但是,当我们编写或优化高性能的应用程序时,除了算法,我们也不得不面对它。下面我们来举一个例子来证明这一点,我们用c/c++ 写两个简单嵌套循环:

1). for ( i= 0;  i < 1000000;  i++)

      for (j =0; j < 100; j++)

          {expression;}

 

2). for ( i= 0;  i < 100;  i++)

      for (j =0; j < 1000000; j++)

          {expression;}

 

我们知道,当计算表达式相同时,这两个循环所计算得到的结果完全相同,但是你会选择哪一种写法呢?或许绝大多数的程序员压根就没有想过要会有第二种写法,因为他的程序都来自他的逻辑(作为人的一种自然逻辑),而不是“机器”的逻辑,呵呵,是的,我们在写程序,是执行在机器上的程序,所以我们在写程序时,就应该尽量遵循“机器”的逻辑,那样的话,我们就能写出高性能的程序,为什么要第2 种写法要优于第1种写法呢?下面让我们来看一看他关键汇编代码描述就明白了(呵呵,终于用到汇编了):

1.

          mov  cx,0

 A    cmp  cx, 1000000

        jg   Over

        inc  cx

        mov  bx , 0

 B:     cmp  bx, 100       

        jg    A

     inc   bx

some calculate……

jump  B


Over


 

       2. 

          mov  cx,0

 A    cmp  cx, 100

        jg   Over

        inc  cx

        mov  bx , 0

B:      cmp  bx, 1000000       

        jg    A

     inc   bx

some calculate……

jump   B

Over

 

那么我们怎么去评估我们的两个代码的性能呢,在这里我们就去看jump指令,在第一个汇编代码中,我们去评估jg  A指令和 jump B 指令,也就是说,正常情况下,jg  A被执行了1000000次,而jump B 指令被执行了 100* 1000000次,现在让我们来看看第二个汇编代码中的jg  A指令和 jump B 指令分别执行的次数,在正常情况下,我们很容易就得知,jg  A被执行了100次,而jump B 指令被执行了 100* 1000000次,也就是说,在两个代码中,jump B 指令被执行的次数相等,而在第二段代码中jg  A指令执行的次数比第一段代码中执行的次数少1000000次,假设我们的程序运行在Pentium 机上,那么一个jump指令大概执行的一个时钟循环(clock cycle),那么,很明显,第二段代码的执行效率要高于第一段时钟的执行效率。

      上述只是一个很常见的例子,有时候,为了使性能达到我们的要求,我们要优化代码,关键的部分部分通常利用汇编代码去实现,因为使用特定的CPU提供的特殊的指令集通常能大大提高程序的性能(但是,可移植性通常也因此而被牺牲)。

      所以,要成为高手,学习汇编是必要的,因为,汇编能让你在调试你程序的时候更加游刃有余,能让你深入底层,找出很难察觉的Bug,让你更加懂得“机器思维”。而这一切,都是成为高手的必要条件。

你可能感兴趣的:(汇编,c/c++)