本文翻译自http://www.agner.org/optimize/ 仅用于学习交流,不得用于任何商业用途
本手册给那些优秀的程序猿和开发者们提供优化程序的建议。 我假设我的读者们已经熟知c++编程并且对编译器的工作原理有基本的了解。 至于为何选择C++这一种高级语言, 我将在后面的文章中给大家解释。
这个系列的文章来自于我对编译器和处理器的研究。 所有的优化建议都基于X86系列的处理器,无论是来自于Intel、AMD还是VIa, 也无论是32位处理器还是64位的。 主流的平台(基于WIndow、Linux、BSD、或者Mac os)上X86是最为常见的处理器, 尽管这些操作系统也能运行在别的处理器上。文章中的建议其实对于别的平台和编译程序设计语言通用适用。这是我程序优化5个系列文章的第一个系列。 这些系列分别是:
1. C++ 程序优化:Window、Linux和Mac平台上的优化指南
2. 用汇编语言优化程序局部:X86平台上的优化指南
3. Intel、AMD以及VIA Cpu的微体系结构:给汇编程序开发者和编译器开发者的优化指南
4. Instruction tables:List of instruction latencies, throughout and micro-operation breakdowns for Intel, AMD and VIA CPUs。(这个太偏硬件了, 译者只能呵呵)
5. 不同C++ 编译器和操作系统的调用规范。
以上所有系列文章的最新更新您都能从
www.agner.org 上获取。
对于那些只想用高级语言设计程序的读者而言,只需要阅读第一个系列文章就足够了。 后面4个系列的文章是为那些想深入了解指令执行、汇编语言开发、编译器技术和处理器微体系结构等细节的童鞋准备的。 一个高级的优化有时候需要使用一些CPU相关的汇编代码, 这方面的知识正式后4个系列的主要内容。
1.1 优化的代价
现在大学开始的程序设计课程里都在强调结构话和面向对象编程、模块化、可重用性和开发过程的系统性等重要性。 这些要求有时却与优化软件运行速度或软件大小的要求背道而驰。 现在估计每个程序员都听到过“不要让一个函数或方法超过XXX行”的建议或告诫。 然而如果你处在仅仅十几年前, 你听到的建议可能会截然相反,建议可能会是:“如果一个流程只被调用一次,请不要将他分成几个部分来写”。 发生这种观念转变的原因是我们的程序变得越来越庞大和复杂,我们越来越关注软件的开发过程,并且我们的计算机也越来越强大。
相比程序的执行效率,我们将程序的结构化开发置于更高的优先级, 这首当其冲的体现在了我们队编程语言和接口框架的选择上。 这让我们的中端用户必须在继续投资更强大的计算机以适应越来越膨胀的软件包和忍受哪怕是一个简单的任务也会有冗长的响应时间之间做一个“艰难的选择”。
有时候,为了开发出更快更小的软件, 我们必须让软件开发准则有所妥协。 本系列的文章内容正是介绍如果在两者之间做出明智的抉择。 我们将会讨论如何发现并隔离程序的“热点”, 然后几种火力优化这些热点。 我们也会讨论如何避免掉入指针越界,空或野指正的陷阱。 我们还会讨论在时间性能上,哪些高级程序结构简单高效而哪些则消耗昂贵。