根据我所读到的,java (通常)似乎编译java到不是很好(是不是?)优化了java字节码,让jit来优化它。这是真的吗?如果是,是否有任何探索(可能是在替代实现中)让编译器优化代码,以便jit有更少的工作要做(这可能吗)?
此外,许多人似乎不喜欢Java (和许多其他高级内存管理语言)的本机代码生成(有时称为提前编译),这是由于许多原因,例如丧失可移植性(等等),但部分原因是(至少对于那些具有即时编译器的语言)认为提前编译到机器代码将错过jit编译器可以完成的可能的优化,因此从长远来看可能会更慢。
这让我想知道是否有人尝试过为java/(其他内存管理语言)实现http://en.wikipedia.org/wiki/Profile-guided_optimization (编译成二进制文件+一些额外的代码,然后运行程序并分析测试运行的运行时信息,以生成希望更优化的二进制文件以供现实世界使用),以及这与jit代码相比如何?有谁有线索吗?
发布于 2010-07-21 15:53:59
配置文件引导优化有一些警告,其中一个甚至在您链接的Wiki文章中也提到过。其结果是有效的
针对给定示例的
从性能的角度来看,即使在通常被认为(或多或少)相同的平台之间也有相当大的差异(例如,比较单核、512M的旧Athlon与6核的英特尔8G,运行在Linux上,但具有非常不同的内核版本)。针对给定的JVM及其配置的
如果其中任何一个发生变化,那么您的分析结果(以及基于它们的优化)将不再有效。最有可能的是,一些优化仍然会有有益的效果,但其中一些可能会变得次优(甚至会降低性能)。
正如前面提到的,JIT JVM所做的事情与分析非常相似,但它们是在运行中完成的。它也被称为“热点”,因为它不断地监控执行的代码,寻找频繁执行的热点,并试图只优化那些部分。在这一点上,它将能够利用更多关于代码的知识(知道它的上下文,它是如何被其他类使用的,等等)因此,正如你和其他答案所提到的那样,它可以比静态优化做得更好。它将继续监控,如果需要,它将在稍后进行另一轮优化,这一次会更加努力(寻找更多、更昂贵的优化)。
在现实生活数据(使用统计+平台+配置)上工作,可以避免前面提到的警告。
它的代价是它需要花费一些额外的时间在“分析”+JIT上。大部分时间它都花得很好。
我猜配置文件引导的优化器仍然可以与它竞争(甚至击败它),但只有在某些特殊情况下,如果你能避免这些警告:
这种情况很少发生,我猜一般来说JIT会给你带来更好的结果,但我没有证据证明这一点。
如果您的目标是不能进行JIT优化的JVM (我认为大多数小型设备都有这样的JVM),那么从概要指导优化中获得价值的另一种可能性。
顺便说一句,在其他答案中提到的一个缺点是很容易避免的:如果静态/配置文件指导的优化很慢(很可能就是这种情况),那么只在发布(或RCs去测试人员)或在夜间构建期间(时间不是那么重要)。
我认为更大的问题是要有好的样本测试用例。创建和维护它们通常并不容易,而且需要花费大量时间。特别是如果您希望能够自动执行它们,这在这种情况下将是非常必要的。
发布于 2010-07-13 06:27:46
就我个人而言,我认为最大的区别不是JIT编译和AOT编译之间,而是类编译和整个程序优化之间。
当您运行javac时,它只查看单个.java文件,并将其编译为单个.class文件。所有的接口实现、虚方法和重写都会被检查有效性,但没有解决(因为不分析整个程序就不可能知道真正的方法调用目标)。
JVM使用“运行时加载和链接”将所有类组装成一个连贯的程序(并且程序中的任何类都可以调用特定的行为来更改默认的加载/链接行为)。
但是,在运行时,JVM可以删除绝大多数虚拟方法。它可以内联所有的getter和setter,把它们变成原始字段。当这些原始字段被内联时,它可以执行常量传播,以进一步优化代码。(在运行时,没有私有字段这回事。)如果只有一个线程在运行,JVM可以消除所有的同步原语。
长话短说,在不分析整个程序的情况下,有很多优化是不可能的,而进行整个程序分析的最佳时间是在运行时。
发布于 2010-07-21 06:06:52
官方的Java热点编译器在运行时执行“自适应优化”,这本质上与您提到的概要引导优化是相同的。这至少是这个特定Java实现很长一段时间以来的一个特性。
在编译时提前执行更多的静态分析或优化的权衡本质上是从额外的工作中获得的(不断减少的)回报与编译器运行所需的时间。像MLton (用于标准ML)这样的编译器是一个具有大量静态检查的全程序优化编译器。它能产生非常好的代码,但在大中型程序上变得非常、非常慢,即使在快速的系统上也是如此。
因此,Java方法似乎是尽可能多地使用JIT和自适应优化,初始编译过程只生成可接受的有效二进制文件。完全相反的是使用像MLKit这样的方法,它对区域和内存行为进行了大量的静态推断。
https://stackoverflow.com/questions/3228141
复制相似问题