论文部分内容阅读
随着计算机技术的发展,Java作为一种跨平台、易开发的语言,越来越受欢迎。然而其相对较低的性能却是其更广泛运用的一大障碍。尤其是Java对精确异常的支持严重限制了JIT编译器的动态优化的能力。它要求:
1.当一个异常被抛出后,优化后的程序在相应的异常处理程序入口处看到的程序状态,必须和未优化的原程序一致。
2.优化后的程序抛出异常的次序必须和原程序一致。
目前已经有不少在精确异常存在下的优化技术,但它们都是针对代码块内部顺序指令的调度算法,现在几乎没有在软件流水线这样循环级别做带精确异常的优化的算法。本文针对存在精确异常要求的Java程序,提出了一种做软件流水线优化的算法。
它的核心思想是将迭代之间的控制依赖关系转换成迭代内部的数据依赖关系。首先算法为异常处理程序处可见的变量做好备份,当发现异常时可以通过备份的数据恢复那些超前的修改。其次,通过分析将修改内存状态的Store指令统一移到每个迭代的末尾执行,防止出现超前修改。最后,对于连续发现多个异常的情况,算法并不在发现时立即抛出异常。而是先记录下位置待收尾工作完成后再确认异常位置并进行抛出。
本文最后以安腾作为底层平台对该算法进行了测试,实验结果显示该算法在保证Java精确异常要求的情况下能够大幅度提高Java程序的性能。