1. 1、本文档共53页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译r11

第十一章 代码优化 11.1 优化技术简介 11.2 局部优化 11.3 循环优化 优化的概念 编译时刻为改进目标程序的质量而进行的各项工作。 空间效率 时间效率 空间效率和时间效率有时是一对矛盾,有时不能兼顾。 优化的基本要求: 必须是等价变换 为优化的努力必须是值得的。 优化的分类 机器相关性: 机器相关优化:寄存器优化,多处理器优化,特殊指令优化,无用指令消除等。 无关的优化:中间代码优化,源程序优化 优化范围: 局部优化:当个基本块范围内的优化:合并已知量,消除公共子表达式,削减计算强度和删除无用代码。 循环优化:主要是基于循环的优化:循环不变式外提,归纳变量删除,计算强度削减。 全局优化:主要是在整个程序范围内进行的优化。 优化技术简介 消除公共子表达式 循环不变表达式外提 削减计算强度 变换循环控制条件 合并已知量与复写传播 删除无用代码 消除公共子表达式 公共子表达式:如果某个表达式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 ) 循环不变式外提 有些表达式位于循环之内,但是该表达式的值不随着循环的重复执行而改变,该表达式被称为循环的不变表达式。 如果按照前面讲的代码生成方案,每一次循环都讲计算一次。 如果把这个表达式提取到循环外面,该计算就只被执行一次。从而可以获得更加好的效率。 循环不变式的例子 计算半径为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*n; for(n=1; n36; n++) {S:=C*n; printf(“Area is %f”, S); } 修改后的程序中,C的值只需要被计算一次,而原来的程序需要计算36次。 四元式的循环不变式 (1)= 1 n (2) n 36 (21) (3)GOF (4) (4)/ 10 360 t1 (5)* t1 pi t2 (6)* t2 r t3 (7)* t3 r t4 (8)* t4 n t5 (9)= t5 S … … … … (18)+ n 1 t9 (19)= t9 n (20)GO (4) (21) 其中,四元式4,5,6,7是循环不变四元式。 循环不变四元式的相对性 对于多重嵌套的循环,循环不变四元式是相对于某个循环而言的。可能对于更加外层的循环,它就不是循环不变式。 例子: for(i = 1; i10; i++) for(n=1; n360/(5*i); n++) {S:=(5*i)/360*pi*r*r*n;...} 表达式(5*i)/360*pi*r*r对于n的循环(内层循环)是不变表达式,但是对于外层循环,它们不是循环不变表达式。 循环不变表达式优化 需要解决的问题 如何识别循环中的不变表达式? 把循环表达式外提到什么地方? 什么条件下,不变表达式可以外提? 削减计算强度 实现同样的运算可以有多种方式。用计算较快的运算代替较慢的运算。 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 合并常量计算 例子:d

文档评论(0)

qwd513620855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档