(4)程序编译与代码优化

来源:互联网 发布:彩票代购软件 编辑:程序博客网 时间:2024/06/16 14:55

早期(编译期)优化

overview:
1:早期编译期指的是“将.java文件转变为.class文件的过程”.
如javac编译器。

2:该期间的优化并非优化程序的运行效率。javac做了许多针对java语言编码过程的优化措施改善程序员的编码风格提高编码效率。

编译过程:

1:解析:包括词法分析(将源代码中的字符流转变为标记集合)和句法分析(根据标记序列构造抽象语法树–用来描述程序代结构的过程)。

2:填充符号表:符号表是由一组符号地址和符号信息构成的表格。

3:注解处理器:

4:语义分析:主要任务是对语法树结构上正确的源程序进行上下文有关性质的审查。

(1)分为标注检查和数据及控制流分析(进一步验证程序上下文逻辑)(2)解语法糖变量的不变性仅仅由编译器在编译期间保障。

5:字节码生成
(1)将前边步骤所生成的信息转化为字节码写到磁盘中。
(2)泛型会在方法的Code属性中的字节码进行擦除,实际上元数据还是保留了泛型信息。

6:编译器并非一个个地编译java文件,而是将所有编译单元的语法树顶级节点输入到待处理列表后再进行编译,因各个文件之间能够互相提供符号信息。

晚期运行期优化

0:(将字节码编译本地代码,优化就是把那些频繁执行的代码编译为本地代码以提高运行效率)

1: 解释器和编译器经常配合工作。

2:hotspot虚拟机中,默认采用解释器和其中一个编译器直接配合的方式工作,程序使用哪个编译器,取决于虚拟机运行的模式

3:混合模式—》取得平衡(从程序启动响应速度和运行效之间)—-》采用分层编译

4:热点探测:寻找被多次执行的方法或循环体。—》使用方法调用计数器和回边计数器—-》以方法为单位进行编译。

5:虚拟机在代码编译器海未完成之前,都仍然按照解释方式继续执行。

编译过程:
1:Client Compiler主要关注局部性的优化,放弃了许多耗时较长的全局优化手段。
Server Compiler专门面向服务端的典型应用并为服务端的性能皮遏制特别调整过的编译器。

2:第一阶段:一个平台独立的前端将字节码构造成一种高级中间代码(HIR)表示。
第二阶段:一个平台相关的后端从HIR中产生低级中间码表示。
第三阶段:在平台相关的后端中使用线性扫描算法优化,产生机器码。

3:这些代码优化都是建立在代码的某种中间表示或者机器码之上,不是建立在java源代码上。

优化措施:
1:语言无关的:公共子表达式消除。就是前边的表达式E已经计算过了,后边再出现同样的表达式就不需要重复计算,直接使用前边的计算结果就行。

2:语言相关:数组边界检查消除。尽量通过编译期的分析来确定数组边界是否会越界。

3:方法内联:就是把方法调用序列整合到一个方法中。来消除方法调用的成本和为其他优化手段建立良好的基础。
但是由于多态性和虚方法的存在,内联并不容易—》引入“类型继承关系分析”的技术来处理虚方法的内联(就是先选个方法版本内联,不行了再退回去重搞)。

4:逃逸分析:并不是直接优化代码的手段,而是为其他优化手段提供依据的分析技术
对象逃逸是指:该对象可能被外部方法或者其他线程引用。如果确定该对象不会逃逸(如方法中的局部变量),那么就可以针对它做优化。

Comment:
1:java语言的性能上的劣势,如动态扩展,动态安全,垃圾回收等措施虽然拖慢了运行速度。但是却换取了开发效率

2:由于c++编译器的所有优化都在编译期间完成,所以就无法进行以运行期性能监控为基础的优化措施,但java可以。

0 0