9、编程珠玑笔记九代码调优
本篇名言:“即使行动导致错误,却也带来了学习与成长;不行动则是停滞与萎缩。”
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48420231
代码调优,蛤蟆目前很少经历,偶尔帮同事调调脚本,但是更多的也是帮助实现功能,基本不care代码优不优化。只要能执行,那就多等会么,上个厕所喝杯水等,岂不乐哉?
从前面几章的学习也知道代码优不优化对性能实在太大了,适当的代码调优可以起到巨大的作用,以后不得不关注一下了。
作者举了优化图形处理程序的例子,首先通过性能监控,然后发现是malloc函数占用了大量的时间。然后研究内存分配程序,发现最常用记录类型的空间分配次数是次常见记录类型的30倍。然后作者果断使用了高速缓存,将常见类型的空间记录缓存在一个链表中。然后,就可以通过对该链表的快速访问来处理常见的请求,而不必调用通用的内存分配程序。
接着作者给出4个代码调优急救方案和一个大招。
问题一:整数取模。由于取模运算比大多数算术运算要慢10倍。例如k=(j+rotdist)%n;
如果用代码实现取模运算呢?
例如:
K= j+rotdist;
If( k >=n)
K -=n;
成功将取模运算用其他算法来实现。当然前提是取模运算是瓶颈才有效。
问题二:函数、宏和内联代码。
针对取最大值的函数,可以使用宏来实现。如
#define max(a,b)((a)>(b)?(a):(b))
问题三:顺序搜索。顺序搜索本身是比较慢的,作者使用了的方法让蛤蟆大开眼见。
图1
循环只包含一次自增、一次数组访问以及一次测试。通过如上展开,删除了每次自增的操作。
问题四:计算球面距离。
通过将维度、经度的表示转换为x,y,z坐标,计算三个维度上的差值平方和来替代三角函数。将原本计算几个小时的程序缩短到半分钟。
接着作者抛出了关于二分搜索的优化过程。
代码调优的最重要原则就是尽量少用它。对于代码调优者,作者给出的警告居然是“玩火者,小心*”。
最后几条法则如下:
高效处理常见情况
利用等价的代数表达式
使用宏替换函数来打破函数层次
使用哨兵来合并测试条件
利用等价的代数表达式
合并测试条件将每次内循环的数组比较次数从两次减少到一次;利用等价的代数表达式将上下限的表示方法转换为下限与增量表示法;展开循环将程序展开以消除所有的循环开销。