关于code optimization。针对一个问题,这本书提出了层层渐进的不同解决方法,让我加深了对程序优化的认识,非常有趣。比如说:读取字符串的优化。程序优化必须要求懂得现在CPU和存储器怎样工作,代码怎样被编译和执行,怎样判断程序的性能,程序在哪些地方可能会有优化,所以它是个综合性的问题。我总结了一些基本方法手段,还需要实践运用才能掌握。
一:算法:算法是程序优化的根本,选择最好的算法永远都是王道。寻找最优算法。
二:数据结构的设计优化
1、使用尽量小的数据结构。如char好于int好于float。
2、使用便于运算的数据结构。
3、数据合理布局(内存对齐)
(a)结构体数据成员按类型长度排序。
(b)把结构体填充成最长类型长度的整数倍。
4、变量名短好于长。
5、同时声明变量好于分别声明变量。
三:运算优化
C语言数据运算强度的优化,要了解他们的运算强度,然后做出合适的代替,即使用快的运算代替慢的运算。
1、使用位运算。
2、用a*a代替pow(a,2.0)。
3、尽可能减少整数乘法除法。
四:循环:
1、设置合理的循环体。倒数归零的计数方式将比增加计数每循环一次节省一个比较指令周期。
2、在需要时适当展开循环体也可以减少循环次数。因为每次循环都需要有计数器变更,比较计数是否达到循环终止条件等。
3、将循环次数多的作为内循环也是提高循环效率的方法之一。
4、提取循环的公共子式到循环外计算。如果在循环内的语句总是被执行而且产生相同的结果,那么就把他拿到程序外边去。观察程序,找到相同的部分把它提取出来只执行一次。
5、将循环体展开以减少判断过程。
五:判断
合理排列conditions减少判断次数:
1、根据发生频率排列switch语句的case,或者if语句的条件式。
2、将一些低概率条件合并及嵌套判断。
3、将多重条件嵌套判断。
六:数据操作优化
1、使用指针。
2、尽量使用常量。
3、常用变量设置为寄存器变量。
4、初始化好于赋值。
5、减少文件读取操作。
七:其他优化:
1、调整编译器的选项O0~03四个等级,数字越大,优化等级越高。但是这个是非常保守的,非常局限,不能分析动态的程序,另外,指定合适的CPU类型也会使代码得到优化。
2、考虑系统中内存的使用方式cache。开启内存管理器可以大大提高CPU访问内存数据的效率,而合理使用cache可以减少CPU等待读取数据的时间。
3、利用指令集并行结构:硬件一般能并行计算乘法,使用并行计算可以大大提高效率,但它被数据依赖关系限制。超标量体系结构:利用流水线的功能单元去优化。还可以让循环并行,有很多种操作。
4、使用profiler工具,找到程序的瓶颈。ARM profiler工具提供了一个很简单的方式就可以找到程序指令层次和函数层次的瓶颈在哪里。Profiler根据程序在运行时得到的实际数据为依据进行数据分析,为之后的代码覆盖率,代码优化性以及性能表现提供分析数据。但是它只能分析被测试的数据。只能工作为时间周期大于3的程序。
6、还可以用上文提到的时间戳计数器计时来判断程序性能。