深入理解计算机系统:优化程序性能

来源:互联网 发布:消费积分软件 编辑:程序博客网 时间:2024/06/06 13:51

编写高效程序需要几类活动:

  1. 选择合适的算法和数据结构;
  2. 编写出编译器能够有效优化以转换成高效可执行代码的源代码;
  3. 针对运算量特别大的计算,将一个任务分成多个部分,在多核和多处理器的某种组合上并行地计算。

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

现代编译器运用复杂精细的算法来确定一个程序中计算的是什么值,以及它们是如何被使用的,从而简化表达式、减少运算。大多数编译器,包括GCC,向用户提供了一些对它们所使用的优化的控制,最简单的控制就是制定优化级别
有很多妨碍优化的因素,它们主要指的是如果编译器不能否定优化后程序出错的可能性,就要放弃优化。
第一种是存储器别名使用,即两个指针可能指向同一个存储器位置的情况,它可能会导致意想不到的程序行为,所以该情形下不能对此进行优化。
第二个妨碍优化的因素是函数调用。大多数编译器不会试图判断一个函数是否没有副作用,因此会假设最糟的情况,并保持所有函数调用不变。

内联函数替换优化函数调用

包含函数调用的代码可以用一个称为内联函数替换的过程进行优化,即将函数调用替换为函数体。这样的转换既减少了函数调用的开销,也允许对展开的代码作进一步优化。

GCC完成基本的优化,但不会对程序进行更加“有进取心的”编译器所做的那种激进变换。

消除循环的低效率

一种优化是代码移动,即识别要执行多次但计算结果不会发生改变的计算。

减少过程调用

消除不必要的存储器引用

0 0