写程序最主要的目标就是使它在所有可能的情况下都正确工作。
代码剖析程序是测量程序各个部分性能的工具。

程序性能分析

度量标准:每元素的周期数(Cycles Per Element, CPE)

优化编译器的性能

  1. 内存别名使用:两个指针可能指向同一个内存位置的情况
  2. 消除循环的低效率
  • 代码移动:为了改进代码,程序员必须经常帮助编译器显式地完成代码的移动
  • 一个有经验的程序员工作的一部分就是避免引入渐进低效率代码
  1. 减少过程调用
  2. 消除不必要的内存引入
  • 引入临时变量
  1. 循环展开
  2. 展开因子与延迟界限有一定的关系
  3. 提高并行性
  4. 并行因子与延迟界限和处理单元的数目油一定关系
  5. 多个累计变量
  6. 重新结合变换
  7. 用向量指令达到更高的并行度
  8. 低级优化,结构化代码以利用硬件功能

现代处理器

  1. 指令级并行
  2. 两个界限
  3. 延迟界限
  4. 吞吐量界限

寄存器

  1. 现代 x86-64 处理器有 16 个寄存器

分支预测和预测错误处罚

  1. 不要过分关心可预测的分支
  2. 书写适合用条件传送实现的代码
  3. 用功能性的风格重写条件操作,使得编译采用条件数据传送

内存性能

  1. 加载
  • 例如 L1 级 cache 的 4 周期访问时间
  1. 存储
    • 读/写相关操作:指令需要一条一条顺序执行