代码优化定义与原则

代码优化:对代码进行等价变换,不改变程序语义,提高运行效率。

三条原则

  1. 等价:优化前后程序计算结果相同
  2. 有效:优化后确实提高效率(时间/空间)
  3. 合算:优化代价不超过收益

优化时期与范围

按时期

  • 中间代码优化:平台无关,在中间代码上做变换
  • 目标代码优化:平台相关,考虑具体机器特性

按范围(从小到大):

  • 局部优化:基本块内
  • 循环优化:循环结构上
  • 全局优化:跨越基本块/函数

重点 优化三原则(等价、有效、合算)。

基本块(Basic Block)

定义:顺序执行的最长语句序列,具有唯一入口唯一出口

  • 入口:基本块第一条语句
  • 出口:基本块最后一条语句
  • 块内无跳转(除出口外)、无分支

重点 基本块 = 唯一入口 + 唯一出口。

基本块划分方法

入口语句三种类型

  1. 程序/过程的第一条语句
  2. 条件/无条件跳转语句的目标语句
  3. 条件跳转语句的下一条语句(紧跟跳转的语句)

划分步骤

  1. 找出所有入口语句
  2. 从每个入口语句到下一条入口语句(或程序末尾)之间为一个基本块

重点 入口语句三种类型是划分基本块的关键。

控制流图(CFG, Control Flow Graph)

  • 节点:基本块
  • 有向边 表示 执行后可能跳转到
    • 末尾有跳转
    • 末尾无条件跳转 下一基本块 (顺序流)

重点 基本块划分 + 控制流图构建是考试常见题型。

常见优化技术总览

技术说明
常量合并编译时计算常量表达式
常量传播将常量值代入后续使用
公共子表达式删除消除重复计算
循环不变量外提将循环内不变运算移至循环前
无用赋值删除删除对后续无影响的赋值
死代码删除删除不可达代码
强度削弱乘法 加法
归纳变量删除删除可由其他变量表示的归纳变量
函数内嵌用函数体替换调用处

常见优化技术中的局部优化(常量合并、公共子表达式)详见 DAG构造与优化;循环相关的优化(循环不变量外提、强度削弱、归纳变量删除)详见 循环优化与必经节点循环优化算法;全局数据流分析支撑上述优化,详见 数据流分析