基于逃逸分析的优化是Proguard的一个计划功能。同时,有没有像proguard这样的现有工具已经进行了需要逸出分析的优化?
发布于 2010-06-15 00:17:55
是的,我认为Soot framework会执行逸出分析。
发布于 2010-06-20 10:39:58
你对编译器级别的转义分析有什么期望?Java类更像是C中的对象文件--它们链接在JVM中,因此转义分析只能在单个方法级别上执行,这是有限的可用性,并且会阻碍调试(例如,您将有无法单步执行的代码行)。
在Java的设计中,编译器是非常愚蠢的-它检查正确性(如Lint),但不会尝试优化。智能部件被放在JVM中-它使用多种优化技术在当前平台上生成在当前条件下性能良好的代码。由于JVM知道当前加载的所有代码,因此它可以假设比编译器多得多的代码,并执行推测性优化,这些优化在假设无效的那一刻被还原。HotSpot JVM可以在函数运行时(例如,当代码变得“更热”时,在循环中间)用更优化的版本动态替换代码。
当不在调试器中时,生命周期不重叠的变量被折叠,不变量被提升出循环,循环被展开,等等。所有这些都发生在JIT-ted代码中,并且取决于在这个函数中花费了多少时间(花费时间优化从不运行的代码没有多大意义)。如果我们预先执行其中的一些优化,JIT将拥有更少的自由度,总体结果可能是净负面的。
另一种优化是堆栈分配不会逃脱当前方法的对象-这是在某些情况下完成的,尽管我在某处读到一篇论文,执行严格的转义分析的时间与优化所获得的时间表明这是不值得的,因此当前的策略更具启发式。
总体而言,JVM拥有的关于原始代码的信息越多,就越能更好地对其进行优化。而且JVM所做的优化也在不断改进,因此,只有在谈到非常有限和基本的JVM时,我才会考虑编译代码优化。在这些情况下,您无论如何都要通过混淆器运行您的应用程序(缩短类名等)。
https://stackoverflow.com/questions/3018058
复制相似问题