要点:
算法对于软件的性能是有决定性影响的。算法实现的优化就是要充分应用硬件和操作系统的特性,设计合理的数据结构,使得各个模块具有高度的局部性,模块间具有最低的耦合性和最高的并行性。
讨论:
算法优化可以分为算法的科学级优化和技术级优化。科学级的优化如快速排序算法,FFT算法,对该问题域都起了革命性的影响。技术级优化是我们普通工程师的主要工作,如对冒泡算法的实现做优化,可以展开循环,用汇编改写最内层循环,尽可能减少内存访问等。科学级的优化是可遇不可求的,而技术级的优化每个工程师都可以做到。只要我们熟悉硬件特性和操作系统,理解问题域,依据局部性与并行性设计合理的数据结构,都能设计出高效的算法实现。这里我们所说的算法优化都是指技术级优化。以下分几个要点讨论。
第一点, 熟悉硬件和操作系统的特性。因为这是软件运行的平台。对CPU,Cache,RAM,虚拟内存管理,进程线程管理都要理解。
第二点, 理解问题域。对要处理的问题有个清晰的“大图”,各个模块是如何协同工作,模块间的数据流是如何移动,模块间的耦合程度和并行程度,哪些模块是性能瓶颈,这些都要非常清楚。
第三点, 利用局部性和并行性优化模块。20%的模块耗费了整个软件80%的资源。对这部分模块的优化要充分利用局部性和并行性,设计合理的数据结构。
第四点, 遵循算法实现上的几个原则。第一,降低计算复杂度。将一个O(n2)的算法调整成O(n)基本上是科学级的优化,但一些糟糕的算法设计使得原本简单的算法变得很复杂,在优化算法时,考虑清楚计算目标,降低复杂度是很重要的。第二,去除无用计算。糟糕的算法里有大量的无用计算,理清算法的上下文,去除无用计算是最直接有效的优化。第三,重用计算。去除了无用计算,可以考虑如何再进一步调整算法,使得计算能被重用。