- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章:代码优化
第7章代码优化 7.1 优化概述 优化是一种等价的、有效的程序变换。优化的目的是为了产生更高效的代码。由优化的编译程序提供的对代码的各种变换必须遵循下面的原则: 等价原则:是指经过优化后不应改变源程序运行的结果。 有效原则:经优化后所产生的目标代码运行时间较短,占用存储空间较小。 合算原则:应尽可能以较低的代价取得较好的优化效果。 优化技术分类 代码优化实际上是对代码进行等价变换,由一组代码变成运行结果相同的另一组代码。 源程序一级的优化:对中间代码的优化,与机器无关,面向各种语言.主要包括:局部优化、循环优化、全局优化 目标代码的优化:与具体机器有关.主要包括对寄存器的优化,多处理机的优化、特殊指令的优化等 优化技术分类 局部优化:程序中顺序执行的语句序列 循环优化:程序中循环语句的优化 全局优化:整个程序范围内的优化 优化的种类: 删除多余运算(或称删除公用子表达式) 代码外提 强度消弱 变换循环控制条件 合并已知量 复写传播 删除无用赋值 中间代码优化举例 设A、B为两个一维数组,他们的初始地址分别为addr(A),addr(B), 源程序段是 S=0 FOR (i=1,i=20;i++) S=S+A[i]+B[i] 假设机器按字节编制 根据程序流向的特点,分为B1,B2两块. B1是循环体外的语句,B2是可重复执行的循环语句序列 原则:通过等价变换,将尽量减少循环体中的语句,同时尽可能减少无实际意义的重复计算与赋值,尽可能降低机器运算强度,运算的级别. 经过优化后,代码具有以下特点: (1)减少了循环体内可执行代码:10条→6条 (2)减少了乘法运算次数:3次→1次 (3)减少了全程范围内使用的变量:i,T4 7.2 局部优化 合并已知量:运算对象是已知量,编译时直接计算它们的值,而不必等到程序运行时再计算。 删除公共子表达式:如果一个表达式E的值,前面已经算过,并且在这之后E的值没有改变,则E称为公共子表达式,则可以避免它的重复运算,称为删除公共子表达式。(删除多余运算) 删除无用赋值:如果一些变量的值在整个程序中不再被使用,则这些变量的赋值对程序的运算结果没有任何作用,则可以删除对这些变量赋值 的代码,称为删除无用赋值。 局部优化 基本块:一个基本块是指程序中一顺序执行的语句序列。其中只有一个入口和一个出口,入口就是其中第一个语句,出口就是最后一条语句。对于一个基本块来说,执行时只能从其入口进入,从出口退出。 局限于基本块范围内的优化称为基本块内的优化,或称局部优化。 划分四元式程序为基本块的算法: 1.求出四元式程序中各个基本块的入口语句: 1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。 2. 对以上求出的每个入口语句,确定其所属的基本块。它是由该入口语句到下一入口语句(不包括该入口语句)、或到一转移语句(包括该转移语句) 、或一停语句(包括该停语句)之间的语句序列组成的。 3. 凡未被纳入某一基本块中的语句,都是程序不可到达的语句,可以从程序中删除。 例:划分基本块 (1) read X (2) read Y (3) C:=X mod Y (4) if C=0 goto (8) (5) X:=Y (6) Y:=C (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (
文档评论(0)