有没有办法在没有JIT开销的情况下实现JIT性能?

时间:2013-06-03 00:11:23

标签: java performance

有没有办法在删除JIT开销的同时实现JIT性能?最好通过将类文件编译为本机映像。

我调查了GCJ,但即使对于一个简单的程序,GCJ输出的性能也比Java JIT差得多。

5 个答案:

答案 0 :(得分:3)

你可以试试Excelsior。

http://www.excelsior-usa.com/jet.html

我过去曾经有过很好的经历(但很久以前)

答案 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/获取大量信息和链接。