- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理第十一章
第十一章 代码优化 11.1 优化技术简介 11.2 局部优化 优化的概念 编译时刻为改进目标程序的质量而进行的各项工作。 空间效率 时间效率 空间效率和时间效率有时是一对矛盾,有时不能兼顾。 优化的基本要求: 必须是等价变换 为优化的努力必须是值得的。 优化的分类 机器相关性: 机器相关优化:寄存器优化,多处理器优化,特殊指令优化,无用指令消除等。 无关的优化:中间代码优化,源程序优化 优化范围: 局部优化:基本块范围内的优化:合并已知量,消除公共子表达式,削减计算强度和删除无用代码。 循环优化:主要是基于循环的优化:循环不变式外提,归纳变量删除,计算强度削减。 全局优化:主要是在整个程序范围内进行的优化。 优化技术简介 合并常量计算 消除公共子表达式 削减计算强度 删除无用代码 循环不变表达式外提 归纳变量删除 合并常量计算 例子:d = 2*3.14*r (1) ( *,2,3.14,t1 ) (2) ( *,t1 , r,t2 ) (3) ( =,t2, , d ) 2*3.14的值在编译时刻就可以确定。 (1) ( *,6.28,r,t2 ) (2) ( =,t2, , d ) 消除公共子表达式 公共子表达式:如果某个表达式E先前已经计算,且从上次计算到现在,E中的变量的值没有改变。那么E的这次出现称为公共子表达式。 利用先前的计算结果,可以避免对公共子表达式的重复计算。 例 (1)( +,b,c,a ) (2)( -,a,d,b ) (3)( +,b,c,c ) (4)( -,a,d,d ) 显然,第2和4个四元式计算的是同一个值,所以第四个四元式可以修改为( =, b, , d )。 对于第1和3个四元式,虽然都是计算b+c,但是他们的值其实是不同的,所以不能修改。 例子 x+y*t-a*(x+y*t)/(y*t) (1)( *, y, t, t1 ) (2)( +, x, t1, t2 ) (3)( *, y, t, t3 ) (4)( +, x, t3, t4 ) (5)( *, a, t4,t5 ) (6)( *, y, t, t6 ) (7)( /, t5, t1,t7 ) (8)( -, t2, t7, t8 ) 消除公共子表达式之后: (1)( *, y, t, t1 ) (2)( +, x, t1, t2 ) (3)( *, a, t2,t5 ) (4)( /, t5, t1, t7 ) (5)( -, t2, t7,t8 ) 削减计算强度 实现同样的运算可以有多种方式。用计算较快的运算代替较慢的运算。 x2 变成 x*x。 2*x或2.0*x 变成 x+x x/2 变成 x*0.5 anxn+an-1xn-1+…+a1x+a0变成 ((…(anx+an-1)x+ an-2)…)x+a1)x+a0 删除无用代码 如果四元式( op,x,y,z)之后,z的值再也没有被使用到,那么这个四元式是无用的。 无用的四元式往往意味着程序的错误,一般不会出现在正确的程序里面。 多数无用四元式是由优化引起的。 循环不变式外提 有些表达式位于循环之内,但是该表达式的值不随着循环的重复执行而改变,该表达式被称为循环的不变表达式。 如果把这个表达式提取到循环外面,该计算就只被执行一次。从而可以获得更加好的效率。 循环不变式的例子 计算半径为r的从10度到360度的扇形的面积: for(n=1; n36; n++) {S:=10/360*pi*r*r*n; printf(“Area is %f”, S); } 显然,表达式10/360*pi*r*r中的各个量在循环过程中不改变。可以修改程序如下: C= 10/360*pi*r*r for(n=1; n36; n++) {S:=C*n; printf(“Area is %f”, S); } 修改后的程序中,C的值只需要被计算一次,而原来的程序需要计算36次。 归纳变量的删除 在循环中,如果变量i的值随着循环的每次重复都固定地增加或者减少某个常量,则称i为循环的归纳变量。 如果在一个循环中有多个归纳变量,归纳变量的个数往往可以减少,甚至减少到1个。减少归纳变量的优化称为归纳变量的删除。 归纳变量的删除(例子) 例子: p=0; for(i = 1; i= 20; i++) p= p+A[i]*B[i]; i作为计数器。每次重复,i的值增加1,而A[i], B[i]对应的地址t1, t3增加4。 我们可以删除i,而使用t1或者t3进行循环结束条件的测试。 归纳变量的删除 归纳变量的删除一方面可以删除变量,减少四元式,另外,删除归纳变量同时也
您可能关注的文档
最近下载
- 絮凝剂对MBR活性污泥理化性质的影响研究.pdf VIP
- 2026年高考作文素材积累之九三阅兵:这一刻,与祖国同频共振.docx VIP
- 2025年辽宁省初中学业水平考试英语模拟试卷试题(含答案).pdf VIP
- 2025年辽宁省大连市中考英语模拟试卷.docx VIP
- 2025年中考英语冲刺模拟试卷-辽宁地区-学生版.pdf VIP
- 螺纹联接与螺旋传动介绍.ppt VIP
- 《大学美育》教案 第13课 光影流转的传奇 影视之美(二).docx VIP
- 小学生3500个常用汉字归类(带拼音).pdf VIP
- 《大学美育》教案 第12课 光影流转的传奇 影视之美(一).docx VIP
- 《大学美育》教案 第11课 五彩缤纷的世界:绘画之美(二).docx VIP
文档评论(0)