最近读了一些书(CSAPP & CLRS),也分析和编写了一些基础算法,有必要归纳从中获取的经验,以备后用。
优化方案
我把优化范围三个领域,如下:
1、问题领域
指的是在设计阶段建立问题模型时,所使用的优化方案
- 选择好适当的算法和数据结构,避免使用时间复杂度高的算法或最坏情况(如在大规模数据中使用快速排序代替选择排序,优化快速排序以避免数据已有序的最坏情况)。
- 问题的解决方案在宏观上是否可以并行化(矩阵运算,是;斐波那契数列,否)
2、编码领域
抽象于计算机结构之上的普适的编码优化规范
- 选择和设计性能较好的和适合业务的基础库(如连接池)
- 尽量消除实现时的重复计算(如减少循环内的函数调用和判断等)
3、计算机结构领域
需要结合计算机特性的优化方针
- 充分利用处理器多发射超标量等内部并行性(如展开循环)
- 提高代码的局部性(多使用局部变量代替存储器引用,内存尽量顺序访问等)
- 防止寄存器溢出(不要过多的局部变量,X64比X86有着更多的寄存器)
- 防止打断CPU流水线(减少不可预测的分支判断,使用条件转移指令者替代或者以小的代价消除分支)
- 使用扩展指令集来提高性能(如MMX,SSE,AVX等)
注意事项
在实际开发中,需要根据具体问题来选择优化方案。因为很多优化选项都会带来更多的限制条件。
如
- 方案1.1性能更高的红黑树需要比AVL树更复杂的代码,这样就带来开发和维护上的成本增加。
- 方案1.2必须在多核/多处理机上才能发挥作用。
- 方案3.1和3.4可能会降低代码的可读性,从而导致维护成本升高。
- 方案3.5则会降低程序的通用性。
由于优化是有代价的,所以我们在优化前要确定这程序/模块是否需要优化。D.E.Knuth说:过早优化是万恶之源,没有仔细分析的优化无异于耽误开发进度。
在开发程序之前,要根据设计找到性能的热点,在此下功夫。若是优化已有程序则需要用prof工具检测到热点再对其改造。
先坐沙发再慢慢看
介个总结高度抽象啊,要是能举几个栗子就更好了~~
俺一点都看不懂,其实就是抢了沙发。
只抢沙发小心被关小黑屋
呃……好吧,我只看懂了3.计算机结构领域这个小标题下面的那五行。。
把这个看懂基本上全文无压力的说。
凑合凑合,一般看懂。。
等你这些书看完,差不多可以找个程序员的工作了
呃……CLSR+CSAPP?
你现在看的那些书
呃。。不能无限嵌套略纠结思密达啊
你的那个嵌套代码不对哦。每次发邮件提醒都是发给第一个人了。
有高度抽象的例子
呃……我现在看书是完全看不进去,完全记不住。
不算完全看明白~
提高代码的局部性这条不是完全明白
还有就是维护成本的概念~是指优化代码之后,后期修改代码的复杂度和人工的费时费力吗?
提高代码的局部性是为了更好的利用计算机的缓存系统。如果你访问的东西都是在缓存内部,那么速度自然要比访问下一层的存储器系统更快。
维护成本正如你所说
完全看不懂,直接无视。
惊现刀之魂同学
少年,不YM一番么
当然要YM一番