C/C++语言执行效率的优化方法(待续)
来源:互联网 发布:戴荃 悟空 抄袭 知乎 编辑:程序博客网 时间:2024/04/29 17:01
个人总结,也可能和编译器与环境有关,没有绝对!下边以linux系统、AT&T指令集、GCC编译器为编译运行环境。
1.循环条件和下标的设立,尽量迁就下标操作,下标有加法的话,会增加计算偏移量的汇编语句。
比如这个十六进制转换十进制的例子,这个下标加2是为了跳过十六进制的开头"0x",(此例假设输入正确,直接跳,也可以加"0x"是否合法的判定,不赘述):
x11 input = "0x123"; x x12 //佁~G设轾S佅¥没轔~YL跳达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
- C/C++语言执行效率的优化方法(待续)
- 关于大数循环效率优化的方法(C#)
- C语言中调用lua 脚本执行的效率测试
- 关于提高C语言执行效率的几点
- 如何提高MSP430 C语言代码的执行效率
- C语言优化方法
- 【C语言】数组--待续
- C语言函数的封装(未完待续)
- 优化sql语句执行效率的方法
- C语言中存储标志(flag)效率最高的方法
- 单片机提高C语言代码效率的方法
- C语言提高代码效率的几种方法
- C语言注意点收集(待续)
- C语言基础笔记...(待续...)
- C语言面试汇总(待续)
- c语言编程优化方法
- C语言程序优化方法
- C语言--错题集<待续中>
- 【leetcode】Array——Largest Rectangle in Histogram(84)
- HTML5基础
- TCP/IP、Http的区别
- Fibonacci数列计算
- hdoj 排列2 1716 (排序&输出格式)
- C/C++语言执行效率的优化方法(待续)
- JSON数据解析
- 测试基本概念
- cocos2dx 浏览器
- javascript继承
- hdoj--1872--稳定排序(水题)
- 安卓开发中的双日期选择控件(可隐藏日,只显示年月)
- Linux内核分析:实验三
- java运行 第一个helloword!