在这个硬件性能日新月异的年代里,我们充分的享受着硬件带给我们的“免费午餐”,似忽软件的效率问题已经不再是一种被开发者关心的问题,但是,随着CPU的主频提高步伐越来越慢,高速缓存也不是可以无限制增加,新技术的使用逐渐被用来提高硬件的性能,这时候,要充分发挥这些新特性,软件的支持就显得很重要了,于是,程序的运行效率再一次映入我们的视野,新时代的软件优化,我们该何去何从?
看见这篇文章的标题,你可能会说:噢,有必要吗,现在的电脑速度越来越快,何苦去费力写高性能的程序呢?如果程序性能实在无法恭维,满足不了需求,那大不了去换一块更快的CPU,问题就可以轻松解决了。
或许曾经如此,但种种迹象表明,硬件业为软件业提供的免费“性能提升”午餐已经快要到头了,CPU的主频提高步伐越来越慢,高速缓存也不是可以无限制增加,现在CPU更多地用新指令集、并行执行、乱序执行、多处理内核等技术来提高速度,而这些技术都需要软件的配合才能发挥作用。如果软件没有使用MMX、3DNow、SSE等指令集,那么就无法享受这些指令集带来的性能提升;如果程序内部并行性不好(没有使用多线程构架、执行流中条件转移过多),那么就无法高效利用CPU的并行处理功能(多内核、乱序并行执行)。所以,“如何编写高性能程序”还是一门需要仔细钻研的学问。
幸运的是,这些“需要软件的配合”的工作大多数可以由编译器来自动完成。所以绝大多数情况下我们不需要也不应该牺牲程序的可读性去做局部优化。本文的“何时不应该做优化”一节对此进行了详细讨论。
但是,也有很多优化,特别是较大粒度、较高抽象层次的优化,至少在目前,编译器是无法做到的。比如,把单线程构架改成多线程构架(这点非常重要,否则哪怕运行在四内核的处理器上你的程序也只能占用一个内核,而现在Intel、AMD、IBM都把在处理器上集成多内核当作了主要的提升处理器性能的手段),使用较低时间复杂性的算法,等等。本文的“何时应该做优化”以及“优化的步骤”两个小节对此做了展开叙述。
涉及到较高层次的优化,以及系统构架对性能的影响,其实有很多规律可行。本文的“设计构架时要注意的一些原则”和“性能模式与反模式”两小节对此进行了叙述。