《深入理解计算机系统》读书笔记(五)优化程序性能

前言

继续阅读《深入理解计算机系统》这本经典书籍
本节是第五章
优化程序性能

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

大多数编译器提供一些对优化的控制
最简单的是指定优化级别,如-Og调用GCC
优化必须是安全的,即优化后的程序行为不变

妨碍优化的因素

  • 内存别名使用
  • 函数调用

内存别名使用:两个指针可能指向同一个内存位置
以下面两个函数为例
看似twiddle2效率更高
但是编译器需考虑xp=yp的情况
故不能产生twiddle2风格的代码作为twiddle1的优化
《深入理解计算机系统》读书笔记(五)优化程序性能
函数调用
以下面两个函数为例
看似func2效率更高
《深入理解计算机系统》读书笔记(五)优化程序性能
但考虑下面这个f
func1返回的是0+1+2+3=6
func2返回的是4*0=0
《深入理解计算机系统》读书笔记(五)优化程序性能

2、表示程序性能

每元素的周期数(CPE)作为表示性能的方法
以下面两个函数为例
《深入理解计算机系统》读书笔记(五)优化程序性能
《深入理解计算机系统》读书笔记(五)优化程序性能
两条线的斜率为CPE
故CPE1=9.0
CPE2=6.0
函数psum2更好

3、消除循环的低效率

对比以下两个函数
《深入理解计算机系统》读书笔记(五)优化程序性能
《深入理解计算机系统》读书笔记(五)优化程序性能
这其实是很常见的将需要执行多次且结果不变的计算
用更多的空间进行存储调用

进一步优化如下
《深入理解计算机系统》读书笔记(五)优化程序性能

4、消除不必要的内存引用

上面combine3的汇编如下

《深入理解计算机系统》读书笔记(五)优化程序性能

每次迭代,累计变量的数值都要从内存独处再写入内存
很浪费

优化如下
《深入理解计算机系统》读书笔记(五)优化程序性能
《深入理解计算机系统》读书笔记(五)优化程序性能
将结果累计在临时变量中

5、循环展开

通过增加每次迭代的元素数量
减少循环的迭代次数

一个2*1循环展开如下
《深入理解计算机系统》读书笔记(五)优化程序性能
其操作抽象为数据流
《深入理解计算机系统》读书笔记(五)优化程序性能

6、提高并行性

《深入理解计算机系统》读书笔记(五)优化程序性能
《深入理解计算机系统》读书笔记(五)优化程序性能
重新结合变换
《深入理解计算机系统》读书笔记(五)优化程序性能
《深入理解计算机系统》读书笔记(五)优化程序性能

结语

主要是以下几点

  • 理解编译器优化的限制
  • 用CPE衡量程序性能
  • 空间换时间,包括消除不必要的内存引用、循环展开