有没有办法在删除JIT开销的同时实现JIT性能?最好通过将类文件编译为本机映像。
我调查了GCJ,但即使对于一个简单的程序,GCJ输出的性能也比Java JIT差得多。
答案 0 :(得分:3)
答案 1 :(得分:2)
过去有一些针对Java的“静态”编译器,但我不知道目前有任何可用的编译器。据我所知,最后一个使用的是IBM iSeries“Classic JVM”的“Java Transformer”,但该JVM不赞成使用J9 JVM。
“Java Transformer”做得很好,但正如其他人所说,它无法利用JITC在运行时可用的所有信息(尽管它确实设法利用了一些运行时信息)。
(并且应该注意“JITC开销”实际上是最小的。在大多数情况下编译发生得非常快速和有效。问题是编译甚至没有启动,直到解释器运行足够长时间来收集统计信息并触发JITC。)
答案 2 :(得分:2)
最简单的解决方案通常是在启动时预热代码。如果您有基于服务器的应用程序,则启动成本不如使用服务时的成本那么重要。在这种情况下,您可以通过调用10K - 20K次来预热所有关键代码,从而触发所有编译代码。
在简单的情况下,这可能需要不到一秒的时间,因此对启动的影响非常小,并且意味着您在使用服务时使用已编译的代码。
如果你有一个基于客户端的应用程序,你通常只有一个用户有很多处理能力,在这种情况下,后台JIT的成本就不那么重要了。
故事的寓意是;在深入研究解决方案之前,请尝试检查您是否有问题要解决。关于堆栈溢流的问题通常是关于a)已经解决或b)首先不是重要问题的问题。
衡量问题或表现的程度是最重要和最不重要的指南。如果你不衡量,你只是在猜测。 (即使您有10年以上的性能调优Java系统)
答案 3 :(得分:0)
我刚刚在这里找到答案:
Why is Java faster when using a JIT vs. compiling to machine code?
引自最佳答案:
这意味着您无法编写涵盖所有Java的AOT编译器 程序,因为只有在运行时可用的信息 该计划的特点。
答案 4 :(得分:0)
我建议您在尝试AOT编译或重写C ++中的任何部分之前找到Java代码性能较差的根本原因。
前往http://www.javaperformancetuning.com/获取大量信息和链接。