代码优化
以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记。
概述
.1. 目的:提高目标代码运行效率。时间效率(减少运行时间);空间效率(减少内存容量)。
原则:进行优化必须严格遵循“不能改变原有程序语义”原则。
2. 优化的分类
从优化的层次,与机器是否有关,分为:独立于机器的优化、与机器有关的优化。
从优化涉及的范围,又分为:局部优化、循环优化、全局优化。
3. 满足以下三个条件的程序段,称为基本块:
- 只有一个入口和一个出口,且语句为顺序执行的程序段。
- 它使得所有转向该基本块的入口都是该基本块的第一条语句。
- 如果块中任一语句被执行,则该块内的所有语句也将被执行(无分支),且执行次数一样(无循环)。
基本块划分问题
(1)确定入口语句
- 语句序列第一句为入口语句;
- 任何可以由条件/无条件跳转而转移到的第一条语句为入口语句;
- 紧跟在跳转语句之后的第一条语句为入口语句;
(2)每个入口语句直到下一个入口语句或程序结束,之间的语句属于同一个基本快。
优化基本方法
1. 利用代数性质(代数变换)
- 编译时完成常数表达式的计算,如a:=5+6+x变成a:=11+x。
- 数组下标引用时,下标偏移可在编译时预先做好。
- 运算强度减弱,如x*8变成x<<3。
2. 复写(copy)传播:如 x:=y 这样的赋值语句,二者值相同,有些情况可以用y代替x编译。其实就是将多语句简化,减少值的传播过程。
3. 删除公共达式:具有相同值的子表达式在两个以上地方出现时,称它为公共子表达式。可以将之删除至一次,将多次计算变为一次。
4. 删除冗余代码:冗余代码就是毫无实际意义的代码,又称死代码 (deadcode)或无用代码(useless code)。永远不会执行的代码。
5. 循环优化
- 循环不变式的代码外提:提取出循环过程中不随循环控制变量改变的表达式至循环之外,从而减少计算次数,也称频度削弱。
- 循环展开:将循环展开减少执行语句数量,以空间换时间。
- 归纳变量的优化和条件判断的替换
- 其他循环优化方法:把多重嵌套的循环变成单层循环;把 n 个相同形式的循环合成一个循环等。
6. in_line展开:把过程(或函数)调用改为in_line展开可节省许多处理过程(函数)调用所花费的开销。省去了函数调用时参数压栈,保存返回地址等指令。这也仅仅限于简单的函数。
7. 其他方法,如控制流方法。
引用说明
- 邵老师课堂PDF
- 《编译原理级编译程序构造》