《深入理解计算机系统》读书笔记(五)优化程序性能
前言
继续阅读《深入理解计算机系统》这本经典书籍
本节是第五章
优化程序性能
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衡量程序性能
- 空间换时间,包括消除不必要的内存引用、循环展开