优化程序性能

  • 编写高效程序需要做到以下几点:
    1. 必须选择一组适当的算法和数据结构
    2. 必须编写出编译器能够有效优化以及转换成高校可执行代码的源代码。
    3. 多处理器的某种组合上并行地计算,将一个任务分成多个部分,这些部分可以在多核和多处理器地某种组合上并行的计算。

优化编译器的能力和局限性

  • 现代编译器运用复杂精细的算法来确定一个程序中计算的是什么值,以及它们是被如何使用的。然后会利用一些机会来简化表达式,在几个不同的地方使用同一个计算,以及降低一个给定的计算必须被执行的次数。
  • 编译器必须很小心地对程序只使用安全的优化,也就是说对于程序可能遇到的所有可能的情况,在C语言标准提供的保证之下,优化后得到的程序和未优化的版本有一样的行为。限制编译器只进行安全的优化,消除了造成不希望的运行时行为的一些可能的原因,但是这也意味着程序员必须花费更大的力气写出编译器能够将之转换成有效机器代码的程序。
  • 两个指针可能指向同一个内存位置的情况称为内存别名使用(memory aliasing)。在只执行安全的优化中,编译器必须假设不同的指针可能会指向内存中同一个位置。

表示程序性能

  • 引入度量标准每元素的周期数(Cycle Per Element,CPE),作为一种表示程序性能并指导我们改进代码的方法。CPE这种度量标准帮助我们在更细节的级别上理解迭代程序的循环性能。
  • 处理器活动的顺序是由时钟控制的。时钟提供了某个频率的规律信号,通常用千兆赫兹(GHz),即十亿周期每秒来表示。用时钟周期来表示,度量值表示的是执行了多少条指令,而不是时钟运行得有多快。

消除循环的低效率

  • 代码移动(code motion):这类优化包括识别要执行多次(例如在循环里)但是计算结果不会改变的计算。因而可以将计算移动到代码前面不会被多次求值的部分。

减少过程调用

  • 过程调用会带来开销,而且妨碍大多数形式的程序优化。

消除不必要的内存引用

  • 把结果放在临时变量中,消除了每次循环迭代中从内存中读出并将更新值写回的需要。