- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
代码优化概述
代码优化概述
1.1.代码优化简介
代码优化是指对程序进行各种等价变换,使得从变换后的程序出发,能生成
更高效的目标代码。目标代码的质量,通常有两个衡量的标准:空间效率和时间
效率。有时空间优化也会导致时间优化(如减少指令条数),但通常它们是一对
矛盾,不能兼顾。代码优化的目的是产生更高效的代码,使程序以更快的速度、
占用更少的空间运行。
对于编译器,代码优化分为三个阶段:
控制流分析 数据流分析 代码变换
图 1-1 代码优化流程图
为了获得更优化的程序,可以从各个环节着手。首先,在源代码这一级,程
序员可以通过选择适当的算法和安排适当的实现语句来提高程序的效率。其次,
再设计语义动作时,要尽可能产生高效的中间代码,同时还可以安排专门的编译
优化阶段对中间代码进行各种等价变换,改进代码的效率。最后,在目标代码这
一级上,应该考虑如何有效地利用寄存器,如何选择指令,以及进行窥孔优化等。
对于编译优化,最主要的时机是在语法、语义分析生成中间代码之后,在中间代
码上进行。这一类优化不依赖于具体的计算机,而取决于语言的结构。另一类优
化则是在生成目标程序时进行的,它在很大程度上与具体的计算机有关。
由优化编译程序提供的对代码的各种变换必须遵循如下原则[1]:
1) 等价: 经过优化后不改变程序运行的结果;
2) 有效: 优化后产生的目标代码运行时间较短,占用的存储空间较小;
3) 合算: 应尽可能以较低的代价取得较好的优化效果。如果为实现一种
优化变换所花时间和精力,以及编译器编译源程序时的额外开销,不能
从目标程序的运行中得到补偿,那么是没有意义的。
在设计一个编译程序时,究竟应考虑哪些优化项目以及各种优化项目进行到
何种程度,应权衡利弊,根据具体情况而定。
其中,控制流分析主要目的是分析出程序的循环结构.循环结构中的代码的
效率是整个程序的效率的关键。数据流分析进行数据流信息的收集,主要是变量
的值的定义和使用情况的数据流信息.包括到达-定值分析;可用表达式;活跃变
量。最后,根据上面的分析,对中间代码进行等价变换。
对现代体系结构的编译器来说,代码优化非常重要,通过它能充分发挥硬件
性能,提高执行效率。所以对编译器的优化有更高的要求。
1.2.优化技术的分类
优化技术的分类有很多种方式,下面简单介绍传统的两种划分方式[2]:
1. 根据优化所涉及的范围,现代编译器所使用的优化技术可以分为以下几
类:
1) 局部优化(local optimization )
局部优化是指在基本块内进行的优化,考察一个基本块就可完成。所谓基本
块是指程序中顺序执行的语句序列,其中只有一个入口语句和一个出口语句。程
序的执行只能从入口语句进入,从出口语句退出。这个代码序列中没有跳进或跳
出语句(过程调用表示一种特殊的跳转),而且是顺序执行。基本块可以通过有
向无循环图(DAG)来表示,那么优化工作就是在 DAG 上所进行的一系列的变换,
但是并不改变基本块所计算的表达式集合。常用的局部优化技术包括局部公共子
表达式删除、删除多余代码、交换语句次序、重命名临时变量。
2) 循环优化(loop optimization )
所谓循环,简单而言就是指程序中可能反复执行的代码序列。因为循环中的
代码会反复的执行,所以循环的优化对于提高整个代码的质量有很大的帮助。首
先在控制流程图(CFG) 中根据循环的定义找出循环,然后就可以针对每个循环进
行相应的优化工作。主要有以下三种:代码外提、删除归纳变量、强度削弱。循
环优化一直是研究的热点和难点,尤其是在并行处理系统中如何根据不同的循环
类型进行循环置换(loop permutation),提高循环内矢量运算的并行性,都是当前
的热门研究课题。
3) 全局优化(global optimization)
一个过程可以由多个基本块按照相应的流程来组成。全局优化就是基于这些
基本块之间的优化。为了进行全局代码优化,必须在考察基本块之间的相互联系
与影响的基础上才能完成。首先必须进行过程内数据流分析(intraprocedural
dataflow analysis),然后编译器将收集的信息分配给各
文档评论(0)