C/C++语言执行效率的优化方法(待续)

来源:互联网 发布:戴荃 悟空 抄袭 知乎 编辑:程序博客网 时间:2024/04/29 17:01

个人总结,也可能和编译器与环境有关,没有绝对!下边以linux系统、AT&T指令集、GCC编译器为编译运行环境。


1.循环条件和下标的设立,尽量迁就下标操作,下标有加法的话,会增加计算偏移量的汇编语句。

比如这个十六进制转换十进制的例子,这个下标加2是为了跳过十六进制的开头"0x",(此例假设输入正确,直接跳,也可以加"0x"是否合法的判定,不赘述):

   x11                      input = "0x123";                                               x   x12                      //佁~G设轾S佅¥没轔~Y﻾L跳达G0x                                  xB+ x13                      for(int i = 0;i < input.size() - 2;i++)                        x   x14                      {                                                              xB+ x15                              if(input[i + 2] >= 'a' && input[i + 2] <= 'f')//壾D潐x   x16                              {                                                      x   x17                                      iTemp = input[i + 2] - 'a' + 10;               x   x18                              }else if(input[i + 2] >= 'A' && input[i + 2] <= 'F')// x   x19                              {                                                      x   x20                                      iTemp = input[i + 2] - 'A' + 10;               x   x21                              }else if(input[i + 2] >= '0' && input[i + 2] <= '9')   x   x22                              {                                                      x  >x23                                      iTemp = input[i + 2] - '0';                    x   x24                              }                                                      x   x25                              iResult = iResult * 16 + iTemp;//潔¨彖°住~B录°iTemp x   x26                      }    

尽量不要这样做,因为这样会有额外的加法产生,无论条件判断,还是内部操作

  >x0x804894f <main()+379>  mov    0x1c(%esp),%eax                                         x   x0x8048953 <main()+383>  add    $0x2,%eax                                               x   x0x8048956 <main()+386>  mov    %eax,0x4(%esp)                                          x   x0x804895a <main()+390>  lea    0x10(%esp),%eax                                         x   x0x804895e <main()+394>  mov    %eax,(%esp)                                             x   x0x8048961 <main()+397>  call   0x8048674 <_ZNSsixEj@plt>   
既然都是i+2,就把for循环改一下:
                input = "0x123";                //假设输入没错,跳过0x                for(int i = 2;i < input.size() ;i++)//为了执行效率而优化的条件                {                        if(input[i] >= 'a' && input[i] <= 'f')//处理                        {                                iTemp = input[i] - 'a' + 10;                        }else if(input[i] >= 'A' && input[i] <= 'F')//处理                        {                                iTemp = input[i] - 'A' + 10;                        }else if(input[i] >= '0' && input[i] <= '9')                        {                                iTemp = input[i] - '0';                        }                        iResult = iResult * 16 + iTemp;//用新参数iTemp取代input[i]容易忘了替换此处                }
可读性可能略差一筹,但是这样执行效率更高:
  >x0x8048937 <main()+355>  mov    0x1c(%esp),%eax                                         x   x0x804893b <main()+359>  mov    %eax,0x4(%esp)                                          x   x0x804893f <main()+363>  lea    0x10(%esp),%eax                                         x   x0x8048943 <main()+367>  mov    %eax,(%esp)                                             x   x0x8048946 <main()+370>  call   0x8048674 <_ZNSsixEj@plt>   
少了一次地址偏移量的计算!














0 0
原创粉丝点击