代码优化定义与原则
代码优化:对代码进行等价变换,不改变程序语义,提高运行效率。
三条原则:
- 等价:优化前后程序计算结果相同
- 有效:优化后确实提高效率(时间/空间)
- 合算:优化代价不超过收益
优化时期与范围
按时期:
- 中间代码优化:平台无关,在中间代码上做变换
- 目标代码优化:平台相关,考虑具体机器特性
按范围(从小到大):
- 局部优化:基本块内
- 循环优化:循环结构上
- 全局优化:跨越基本块/函数
重点 优化三原则(等价、有效、合算)。
基本块(Basic Block)
定义:顺序执行的最长语句序列,具有唯一入口和唯一出口。
- 入口:基本块第一条语句
- 出口:基本块最后一条语句
- 块内无跳转(除出口外)、无分支
重点 基本块 = 唯一入口 + 唯一出口。
基本块划分方法
入口语句三种类型:
- 程序/过程的第一条语句
- 条件/无条件跳转语句的目标语句
- 条件跳转语句的下一条语句(紧跟跳转的语句)
划分步骤:
- 找出所有入口语句
- 从每个入口语句到下一条入口语句(或程序末尾)之间为一个基本块
重点 入口语句三种类型是划分基本块的关键。
控制流图(CFG, Control Flow Graph)
- 节点:基本块
- 有向边: 表示 执行后可能跳转到
- 末尾有跳转
- 末尾无条件跳转 下一基本块 (顺序流)
重点 基本块划分 + 控制流图构建是考试常见题型。
常见优化技术总览
| 技术 | 说明 |
|---|---|
| 常量合并 | 编译时计算常量表达式 |
| 常量传播 | 将常量值代入后续使用 |
| 公共子表达式删除 | 消除重复计算 |
| 循环不变量外提 | 将循环内不变运算移至循环前 |
| 无用赋值删除 | 删除对后续无影响的赋值 |
| 死代码删除 | 删除不可达代码 |
| 强度削弱 | 乘法 加法 |
| 归纳变量删除 | 删除可由其他变量表示的归纳变量 |
| 函数内嵌 | 用函数体替换调用处 |
常见优化技术中的局部优化(常量合并、公共子表达式)详见 DAG构造与优化;循环相关的优化(循环不变量外提、强度削弱、归纳变量删除)详见 循环优化与必经节点 和 循环优化算法;全局数据流分析支撑上述优化,详见 数据流分析。