Profile-guided optimization 有一些注意事项,其中之一甚至在您链接的 Wiki 文章中也提到过。它的结果是有效的
- 对于给定的示例,表示用户或其他代码实际使用您的代码的方式。
- 对于给定的平台(CPU、内存+其他硬件、操作系统等)。
从性能的角度来看,即使在通常被认为(或多或少)相同的平台之间也存在相当大的差异(例如,比较单核,旧的 Athlon 与 512M 与 6 核 Intel 与 8G,在 Linux 上运行,但与非常不同的内核版本)。
- 对于给定的 JVM 及其配置。
如果其中任何一个发生变化,那么您的分析结果(以及基于它们的优化)不再需要有效。很可能一些优化仍然会产生有益的影响,但其中一些可能会变得不理想(甚至会降低性能)。
正如前面提到的,JIT JVM 做的事情与分析非常相似,但它们是在运行中进行的。它也被称为“热点”,因为它不断地监控执行的代码,寻找频繁执行的热点,并尝试只优化那些部分。在这一点上,它将能够利用有关代码的更多知识(了解它的上下文,其他类如何使用它等)所以 - 正如您和其他答案所提到的 - 它可以做更好的优化作为静态的。它将继续监控,如果需要,它将在稍后进行另一轮优化,这一次会更加努力(寻找更多、更昂贵的优化)。
处理现实生活中的数据(使用统计 + 平台 + 配置)可以避免前面提到的警告。
它的代价是它需要花费在“分析”+ JIT 上的一些额外时间。大多数时候它度过的很好。
我想配置文件引导的优化器仍然可以与之竞争(甚至击败它),但只有在某些特殊情况下,如果你可以避免警告:
- 您非常确定您的样本很好地代表了现实生活场景,并且它们在执行过程中不会发生太大变化。
- 您非常准确地了解您的目标平台,并且可以对其进行分析。
- 当然,您知道/控制 JVM 及其配置。
它很少发生,我猜一般来说 JIT 会给你更好的结果,但我没有证据证明它。
如果您的目标是无法进行 JIT 优化的 JVM(我认为大多数小型设备都有这样的 JVM),那么从配置文件引导的优化中获得价值的另一种可能性。
BTW one disadvantage mentioned in other answers would be quite easy to avoid: if static/profile guided optimization is slow (which is probably the case) then do it only for releases (or RCs going to testers) or during nightly builds (where time does not matter so much).
I think the much bigger problem would be to have good sample test cases. Creating and maintaining them is usually not easy and takes a lot of time. Especially if you want to be able to execute them automatically, which would be quite essential in this case.