代码优化:
概述:
- 目的:提高代码运行效率,占用更少空间
- 实质:代码之间的等价变换
优化概念:
- 优化等级:
- 源程序级 程序员做的代码优化
- 中间代码级,主要优化内容 编译程序优化部分
- 目标代码级
- 优化代价:
- 优化算法的复杂度,即编程难易程度及算法时间复杂度
- 优化代码和优化程度的关系:
手工水平为最优化代码,也就是汇编 - 优化的分类:
- 局部优化,针对一段顺序执行的语句序列的优化
- 优化方法:
- 合并已知量
- 删除公共子表达式
- 变量传播与无用赋值删除
- 优化方法:
- 局部优化,针对一段顺序执行的语句序列的优化
对于常量运算,可以直接在编译阶段运算出来,给运行阶段提高速度
删除重复运算,使用赋值操作替代重复的运算操作
我们可以发现,红色代码部分的左值是没有作为操作数 或者 重复赋值被覆盖了,所以可以将它们删去。
循环优化:
这里有不变部分,T3和T6,主要是为了计算A,B数组的不变部分(参考数组的定义),这就需要我们将代码外提
这样减少了200次赋值操作
首先进行块内优化,将T1和T4合并为一个,然后观察两个的变化发现,规律是每次加10
将乘法操作同义替换为加法操作,有利于计算机的运算
通过使用T1的每次加10的规律,作为控制变量,这样就删去了i变量
完成循环优化,做局部优化
局部优化:
入口包括:1,3,6,10,根据划分得到
将op施加在B上,得到的值由n2代表,再将A附加在n2上面,表示运算出来的结果,就是A的值
以下为各种类型的四元式通过DAG的表示方式
对于一个基本块,应该怎么操作其对于的DAG图:
当A有定义:
- A为附加标记,将A拿掉,在附加当当前结点上
- A为标记,不拿掉A
当程序到达了第三步,表示常量运算已经运算完了,后面的运算都是需要变量参与的
3.1步是通过一元运算中存在变量运算到达的
3.2步是通过二元运算中存在变量运算到达的
到了第四步,表示运算的结果,要么找到了,要么建好了
其实主要就是做了下面几件事:
1,准备操作数结点
2,合并常数量
3,删除公共子表达式
4,删除无用赋值
创建3.14结点,附加上T0,创建2结点,搜索T0结点,运算得到6.28,删除2结点,将T1附加到6.28上
添加两个结点R,r,父节点进行加法操作,并将T2附在父节点上
运算完6,得到6.28,将T3附到n2上
添加T5*T6,发现需要附上B,发现B有定义了,但是为附加标记,可以删除,为附加标记,表示的就是一个取值操作,但是如果是标记就表示需要参与运算了
我们只需要将DAG图还原就得到了优化后的代码:按n的顺序还原
当T0在后面不需要使用了就可以优化了
我们可以在退出这个基本块之前将局部变量重新命名,这样当下一次基本块优化时,可以继续使用T0,Tn