![]() |
1
2
Profile-guided优化有一些注意事项,其中之一甚至在您链接的Wiki文章中提到过。它的结果是有效的
如果其中任何一个发生了变化,那么您的分析结果(以及基于它们的优化)就不再需要有效了。最有可能的是,有些优化仍然会产生有益的效果,但有些优化结果可能不太理想(甚至会降低性能)。
我猜概要文件引导的优化器仍然可以与之竞争(甚至击败它),但只有在某些特殊情况下,如果您可以避免以下警告:
这种情况很少发生,我猜一般来说JIT会给你更好的结果,但我没有证据。 如果你的目标是一个不能进行JIT优化的JVM(我认为大多数小型设备都有这样一个JVM),那么从profile-guided优化中获得价值的另一种可能性就是。
顺便说一句,在其他答案中提到的一个缺点是很容易避免的:如果静态/概要文件引导的优化速度很慢(可能是这样),那么只在发布时(或者RCs去测试人员)或者在夜间构建时(时间不那么重要)才这样做。
|
![]() |
2
4
我个人认为最大的区别不是JIT编译和AOT编译,而是类编译和整个程序优化。 当您运行javac时,它只查看单个.java文件,并将其编译成单个.class文件。所有的接口实现、虚拟方法和重写都会被检查有效性,但没有得到解决(因为不分析整个程序就不可能知道真正的方法调用目标)。 JVM使用“运行时加载和链接”将所有类组装成一个连贯的程序(程序中的任何类都可以调用专门的行为来更改默认的加载/链接行为)。
长话短说,如果不分析整个程序,有很多优化是不可能的,而进行整个程序分析的最佳时间是在运行时。 |
![]() |
3
1
在编译时执行更多的静态分析或优化过程的代价本质上是您从这个额外的工作中获得的(不断减少的)回报与编译器运行所需的时间相比。像MLton(对于标准ML)这样的编译器是一个具有大量静态检查的全程序优化编译器。它产生了非常好的代码,但在中大型程序上,甚至在快速系统上,速度变得非常非常慢。
|