高性能程序设计经验总结

最近读了一些书(CSAPP & CLRS),也分析和编写了一些基础算法,有必要归纳从中获取的经验,以备后用。

优化方案

我把优化范围三个领域,如下:

1、问题领域

指的是在设计阶段建立问题模型时,所使用的优化方案

  1. 选择好适当的算法和数据结构,避免使用时间复杂度高的算法或最坏情况(如在大规模数据中使用快速排序代替选择排序,优化快速排序以避免数据已有序的最坏情况)。
  2. 问题的解决方案在宏观上是否可以并行化(矩阵运算,是;斐波那契数列,否)

2、编码领域

抽象于计算机结构之上的普适的编码优化规范

  1. 选择和设计性能较好的和适合业务的基础库(如连接池)
  2. 尽量消除实现时的重复计算(如减少循环内的函数调用和判断等)

3、计算机结构领域

需要结合计算机特性的优化方针

  1. 充分利用处理器多发射超标量等内部并行性(如展开循环)
  2. 提高代码的局部性(多使用局部变量代替存储器引用,内存尽量顺序访问等)
  3. 防止寄存器溢出(不要过多的局部变量,X64比X86有着更多的寄存器)
  4. 防止打断CPU流水线(减少不可预测的分支判断,使用条件转移指令者替代或者以小的代价消除分支)
  5. 使用扩展指令集来提高性能(如MMX,SSE,AVX等)

注意事项

在实际开发中,需要根据具体问题来选择优化方案。因为很多优化选项都会带来更多的限制条件。

  • 方案1.1性能更高的红黑树需要比AVL树更复杂的代码,这样就带来开发和维护上的成本增加。
  • 方案1.2必须在多核/多处理机上才能发挥作用。
  • 方案3.1和3.4可能会降低代码的可读性,从而导致维护成本升高。
  • 方案3.5则会降低程序的通用性。

由于优化是有代价的,所以我们在优化前要确定这程序/模块是否需要优化。D.E.Knuth说:过早优化是万恶之源,没有仔细分析的优化无异于耽误开发进度。
在开发程序之前,要根据设计找到性能的热点,在此下功夫。若是优化已有程序则需要用prof工具检测到热点再对其改造。

This entry was posted in 程序设计, 软件工程 and tagged , . Bookmark the permalink.

20 Responses to 高性能程序设计经验总结

  1. 大D says:

    先坐沙发再慢慢看

  2. 52computer says:

    介个总结高度抽象啊,要是能举几个栗子就更好了~~

  3. 梦之翼 says:

    不算完全看明白~
    提高代码的局部性这条不是完全明白
    还有就是维护成本的概念~是指优化代码之后,后期修改代码的复杂度和人工的费时费力吗?

    • davelv says:

      提高代码的局部性是为了更好的利用计算机的缓存系统。如果你访问的东西都是在缓存内部,那么速度自然要比访问下一层的存储器系统更快。

      维护成本正如你所说

  4. 刀之魂 says:

    完全看不懂,直接无视。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注