所以我知道java刚刚及时编译(JIT),这使得它比静态编译语言(如C ++)更具优势。有没有说明java JIT的例子?对于给定的算法,可能的示例可能优于C或C ++代码?或者显示算法的迭代随着时间的推移变得越来越快(我不确定这是否是JIT的一个实例)。或者只是可以显示JIT存在的某种测量的例子?我问这个问题是因为我只读过JIT并希望证明它的存在,而不是仅仅像某种宗教上帝一样相信它。
备注 - 如果这个问题过于自以为是,请发表评论并告诉我原因。我只是对JIT感到好奇,在使用java几年之后,直到今天我还没有意识到我是如何从中受益的,如果它辜负了超越其静态编译对应物的炒作。
附加信息 - 我已经阅读了它何时发布,并且我没有寻找更多信息,我只需要相信是真的,我希望看到的东西能让我看到它做的是什么假设要做。
编辑 - 很好,我有很多回复,所说的是单独比较速度JIT优化与C ++不是一个好方法,纯粹的java比较是最少的可怕。用java显示这个例子怎么样:
因此执行JIT和Non-JIT优化程序。在开始时,JIT没有开始,程序开始变得更快,而静态总是具有相同的性能。然后条件在5.5秒左右变化,应用程序的使用方式略有不同。 JIT能够再次适应这些变化,首先是时间峰值,然后再次开始优化,甚至可以达到更好的最佳状态,因为应用程序的使用略有不同。 这是展示JIT的可接受的例子吗? (我将努力实现这一目标,并审查每个人的链接和视频)。
答案 0 :(得分:3)
我认为您无法令人信服地证明使用JIT的Java比C / C ++静态编译的代码更快。
你可以在java中找到一些超越其c / c ++实现的代码。为此,您需要搜索关键字(基准,Java,JIT,C,C ++)
由于我的观点,我故意没有提及上述任何代码或链接。
大多数时候,人们通过以下方式显示java代码以静态编译的c / c ++打败
我的观点是你试图找到异常,其中java比C / C ++更快,然后将其推广到整个语言。你可以通过在许多算法中使用指针来轻松找到更多c / c ++打败java代码的例子。
此类代码基准测试在现实应用程序开发中毫无价值。
总结(在现实生活中的应用程序开发)
与c / c ++首次出现时相比,Java速度较慢。但是在过去十年中,JVM与JIT,Hotspot等相结合的改进使java与C / C ++一样好。 Java现在并不慢。但我不会在c / c ++上快速称呼它。由于语言改进以及更好的硬件,现实应用程序开发的任何差异都可以忽略不计。
您不能通过在特定环境中使用特定算法或代码将其击败一次来概括java比c / c ++更快。
您可以在以下链接中找到一些有趣的信息
由于问题已被编辑到现在尝试找到使用JIT的性能改进,我正在编辑我的答案以添加几个点。
我对JIT的理解是它将执行得最多的代码改进了可以由编译器快速运行的版本。我遇到的大多数JIT优化技术示例都显示了程序员也可以完成的操作,但这会影响程序的可读性,或者可能无法确认程序员必须使用的框架或编码样式。 / p>
所以我在这里要说的是,如果你编写一个可以通过JIT改进的程序,它会这样做,你会看到性能的提高。但是,如果您是了解JVM并编写已经优化的Java代码的人,那么JIT可能不会给您带来太多好处。
因此,如果您在使用JIT运行程序时看到性能改进,则无法保证所有Java程序都能得到改进。这取决于该计划。
以下链接使用代码示例显示了一些JIT改进。
http://www.infoq.com/articles/Java-Application-Hostile-to-JIT-Compilation
https://plumbr.eu/blog/java/do-you-get-just-in-time-compilation
无论如何,如果我们需要在使用JIT时区分性能,我们将运行一个启用了JIT的java程序,并在禁用JIT的情况下再次运行相同的程序。
此链接http://www.javacodegeeks.com/2013/07/java-just-in-time-compilation-more-than-just-a-buzzword.html有关于此主题的案例研究,并建议以下
评估应用程序的JIT好处
为了理解不在您的Java应用程序中使用JIT的影响,我建议您执行以下实验:
在启用JIT的情况下为您的应用程序生成负载并捕获一些基准数据,如CPU%,响应时间,#请求等
禁用JIT
重做相同的测试并比较结果。
此链接http://people.cse.iitd.ac.in/~sbansal/csl862-virt/readings/CompileJava97.pdf确实对JIT进行了基准测试,并显示了基本JVM解释的速度提升。
要了解JIT对您的代码的作用,您可以使用JITwatch工具。
https://github.com/AdoptOpenJDK/jitwatch
以下链接说明了它的实用性。
http://www.oracle.com/technetwork/articles/java/architect-evans-pt1-2266278.html
http://zeroturnaround.com/rebellabs/why-it-rocks-to-finally-understand-java-jit-with-jitwatch/
答案 1 :(得分:1)
首先,您要观看this video。它为您提供了查看JIT实施的工具。
我认为你的问题被误导的是你要求一个定制代码的例子,你可以在一些基于JVM的语言X和一些非基于JVM的语言Y(例如,X)中测量更快的性能是Java,Y是C)。
这不是考虑JIT的方法。除非你自己为JVM语言编写一个编译器,或者必须调试一些严重的性能问题,并且只有在之后你考虑重构代码并看到它失败然后你可以深入研究细节
但除此之外,原则很简单:JIT是你的朋友,它做得对;你所要做的就是编写正常工作的代码;如果JIT可以在运行时使其更快,那么它肯定会这样做。
答案 2 :(得分:1)
JIT Just in Time编译是一种在执行字节代码之前完成的预编译。来自ORacle网站:
“从理论上讲,只要调用Java方法,JIT就会投入使用, 并将该方法的字节码编译为本机机器码, 从而“及时”编译它来执行“
JIT最可靠的效果是使用和不使用jit比较java本身。
JIT(Just In Time编译)是在java 1.2中引入的,所以最好用java 1.1和java 1.2执行相同的代码并检查性能。
在java 1.2之前,java被认为是一种非常慢的语言,只有在引入JIT之后,它才被广泛应用于任何领域。
很难比较C ++或C和java。潜在的C ++比java快,因为JIT java也是一种解释型语言。 JIT编译有帮助,因为更频繁执行的代码只会被中断一次而不是每次执行。 java和C ++之间的区别可能涉及库的设计方式,某些基本类型的存在与否,编译代码的方式,优化级别,如果是java如何配置gc等等。
请注意,根据编译参数和执行参数,java和java之间也可能存在差异,具有相同的jdk和相同的jvm。
不可能说Java比C更快或反之亦然,这种比较涉及的参数太多。有时C ++更快,有时java是最好的。
以下是Oracle对JIT编译的引用:http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit.html
答案 3 :(得分:1)
Stack Overflow上有无数的例子,例如“为什么我的代码突然运行得更快?” - 通常当人们尝试对代码进行基准测试时。答案是,总是因为JIT能够在基准测试中进行优化。
有关示例,请参阅:How do I write a correct micro-benchmark in Java?,What is going on in this java benchmark?和Java benchmarking - why is the second loop faster?。
我只读过有关JIT的内容,并希望证明它的存在,而不是像某种宗教上帝一样相信它。
这是一条不必要的思路;你的键盘和显示器之间有很多,你从来没有注意到或者不理解。 JIT是JVM的记录行为,这就是您需要知道的全部内容。如果你不理解它并且想要了解更多,那就没关系,但它不是一些神话般的,空灵的结构。