跳至主要內容

CSAPP Chapter 5:优化程序性能 阅读笔记

salvely大约 3 分钟

前言

写程序的主要目标是:

  1. 使它在所有可能的情况下都能正确的工作
  2. 代码清晰简洁
  3. 让程序运行的快*

什么是快?快”的衡量标准:

  1. 程序是否有实时需求
  2. 执行很久的程序快 20%也是非常重大的影响

因此我们需要编写高效的程序,那么编写高效程序的奥秘在于:

  1. 选择适当的算法和数据结构
  2. 编写出编译器能够有效优化以转化成高效可执行代码的程序
    如何让编译器进行有效的优化呢?我们需要理解编译器的能力和优化的局限性。
  3. 将一个任务分成多个部分,这些部分可以在多核和多处理器的某种组合上并行的计算,让每个并行的线程都以最高效率执行。

那么我们应当如何做呢?我们必须:考虑代码使用的方式,以及影响他的关键因素,在实现简单性和速度之间做出权衡。原因有二:

  1. 高效的算法需要更长的时间优化
  2. 更大级别的优化容易带来不那么容易读的代码

提高代码性能的技术包括:

  1. 消除不必要的工作:
    1. 不依赖目标机器属性的工作包括:包括不必要的函数调用、条件测试和内存引用
    2. 依赖目标机器的属性的工作:我们需要了解处理器时序,因为指令在处理器中可能并行执行,或者顺序不同于他们在程序中出现的顺序 -> 我们提出了基于 Intel 和 AMD 处理器最近设计的高级模型和一种基于图形数据流(data-flow)表示法,可以使处理器对指令的执行形象化,还可以利用它预测程序的性能
  2. 利用处理器的指令集并行,同时执行多条指令。核心是降低一个计算的不同部分之间的数据相关,增加并行度
  3. 使用代码剖析程序

一种重要的方法是:

  1. 研究程序的汇编代码
  2. 识别出降低性能的属性
  3. 预测什么操作会并行执行:确认关键路径

总体来看,程序优化可以体现在以下几个方面:

  1. 程序表面:算法和数据结构的选用,消除不必要的函数调用、条件测试和内存引用
  2. 程序编译阶段:编译器的局限性优化
  3. 程序运行阶段:针对处理器时序,是否可以将其拆分为多个阶段并行执行,确认内循环关键路径
  4. 外部力量:使用代码剖析程序

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

表示程序性能

程序示例

消除循环的低效率

减少过程调用

消除不必要的内存引用

理解现代处理器

整体操作

功能单元的性能

处理器操作的抽象模型

循环展开

提高并行性

多个累积变量

重新结合变换

优化合并代码的结果小结

一些限制因素

寄存器溢出

分支预测和预测错误处罚

理解内存性能

加载的性能

存储的性能

应用:性能提高技术

确认和消除性能瓶颈

程序剖析

使用剖析程序来指导优化

小结