代码优化
一、优化方法
1. 局部优化——DAG方法(重点)
2. 循环优化——程序流程图
3. 全局优化——数据流方程法
二、代码优化类型
按与机器相关性分:
中间代码的优化:与机器无关的优化
目标代码的优化:与机器相关的优化:寄存器的优化,特殊指令的优化,多处理机的优化等(窥孔技术)
按优化的范围来分:
部优化:指在只有一个入口和一个出口的程序块上进行的优化。
循环优化:对循环中的代码进行的优化。
全局优化:在整个程序范围内的优化。
三、常用的代码优化技术
删除公共子表达式
代码外提
强度削弱
变换循环条件(删除归纳变量)
合并已知量
复写传播
删除无用赋值
例:设源程序:S=0;
for(i=1;i<=20;i++)
S = S+A[i] *B[i];
若设addr(A),addr(B)分别表示数组A和B的初始地址,且按字节编址,则此源程序段的中间代码如下:(用变形四元式表示)
1.删除公共子表达式
公共子表达式:指计算结果相同的子表达式
如:B2块中:(3)和(6)式:4*i相同:因此(6)式中4*i计算多余,用T4 =T1代替。
2.循环的代码外提
指将循环体中不变的运算。即将其结果独立于循环执行次数的表达式,提到循环外面。如:B2中的(4)和(7)式。
3.强度削弱
指在不改变运算结果的前提条件下,将执行时间长的运算转换成执行时间短的运算。如加运算比乘运算执行时间短。
如:B2中的(3)式:T1=4*i:i每循环一次增1,则T1每循环一次总是加4。这样可将T1=4*i提到循环外,则用(3’)T1= T1+4放在循环体内代替原T1=4*i。此时(5)式成为循环体内第一条表达式。
4.变换循环控制条件
指若在循环体中存在一个变量T,与循环控制变量i保持线性关系,同时在循环后又不引用i,而除去i又不影响结果则可由T代替i控制循环次数的作用,从循环中删除i, 这种方法称为变换循环控制条件。
如:i与T1保持T1=4*i的线性关系,又循环外不引用i,所以循环控制条件变为:i≤20=>T1≤80且将i=i+1去掉。
5.合并已知量
指在编译时能直接计算其结果的量(常数或赋了值的变量),而不必等到运行时的计算。
如:B1中:(2)i=1(3)T1 = 4*i,i的已知值,则可用T1=4代替T1=4*i
6.复写传播
7.删除无用赋值