java 中 JIT 效果的具体示例

A concrete Example of the effect of the JIT in java

所以我知道 java 具有即时编译 (JIT),这使其比 C++ 等静态编译语言更具优势。是否有说明 java JIT 的示例?对于给定的算法,可能的示例可能优于 C 或 C++ 代码?或者显示算法的迭代随着时间的推移变得越来越快(我不确定这是否是 JIT 的一个实例)。或者只是任何可以显示 JIT 是否存在的某种度量的示例?我问这个问题是因为我只读过 JIT 并希望证明它的存在,而不是像某种宗教上帝一样相信它。

备注 - 如果这个问题过于自以为是,请发表评论并告诉我原因。我只是对 JIT 感到好奇,并且在使用 java 几年之后直到今天我还没有意识到我如何从中受益,以及它是否辜负了超越其静态编译对手的炒作。

其他信息 - 我已经阅读了有关它何时执行的信息,并且我不在寻找更多信息我只需要相信是真的,我想看到一些显示我在做它应该做的事。

EDIT - 很好,我有很多回复,有人说单独比较 JIT 优化与 C++ 的速度并不是一个好方法,而且纯 java 比较是最不可怕的。用 java:

显示这个例子怎么样

因此执行了执行相同操作的 JIT 和非 JIT 优化程序。一开始 JIT 还没有启动,程序开始变得更快,而静态始终具有相同的性能。然后条件在 5.5 秒左右发生变化,应用程序的使用方式略有不同。 JIT 有能力再次适应这些变化,首先是时间峰值,然后它再次开始优化,甚至可以达到更好的最佳状态,因为应用程序的使用方式略有不同。 这是一个可以接受的展示 JIT 的例子吗? (我会努力做到这一点,并审查每个人的链接和视频)。

首先,您想观看 this video。它为您提供了查看 JIT 运行情况的工具。

我认为您的问题被误导的地方是您要求提供一个定制代码的示例,您可以在其中测量某些基于 JVM 的语言 X 与某些非基于 JVM 的语言 Y 相比更快的性能(例如, X 是 Java Y 是 C).

这不是考虑 JIT 的方式。除非你真的自己写了一个 JVM 语言的编译器,或者必须调试一些严重的性能问题,并且只有 after 你考虑过重构你的代码并且看到它失败然后你可以深入研究深入细节。

但除此之外,原则很简单:JIT 是您的朋友,它做事正确;您所要做的就是编写可以正常工作的代码;如果 JIT 有办法让它在运行时更快,它肯定会这样做。

JIT 即时编译是一种在字节码执行之前完成的预编译。来自 Oracle 站点:

"In theory, the JIT comes into use whenever a Java method is called, and it compiles the bytecode of that method into native machine code, thereby compiling it “just in time” to execute"

比较 java 本身使用和不使用 jit,JIT 最可靠的效果是可见的。

JIT(即时编译)是在 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

我认为您无法令人信服地证明 java 使用 JIT 比 C/C++ 静态编译代码更快。

您可以在 java 中找到一些优于其 c/c++ 实现的代码。为此,您需要搜索关键字,例如 (benchmark,Java,JIT,C,C++ )

我特意没有提到上面的任何代码或 link,因为我的观点如下。

大多数时候人们通过以下方式显示 java 静态编译的代码 c/c++

  1. 找到 java 比 c/c++(内存分配)快的部分,只写代码来突出显示它。
  2. 找到 c/C++ 代码的弱点,并尝试编写 java 代码,在实现结果方面打败 c/c++ 代码。
  3. 运行 在您有优势的环境中编写代码,例如拥有快速的硬件和大量内存。

我的意思是你试图找到 java 比 C/C++ 更快的异常,然后将其推广到整个语言。您可以轻松找到更多 c/c++ 仅通过在许多算法中使用指针来击败 java 代码的示例。

这样的代码基准测试在现实生活中的应用程序开发中没有任何价值。

总结(在实际应用程序开发中)

  1. Java 比 c/c++ 刚出来的时候慢。但在过去十年中,JVM 与 JIT、Hotspot 等的改进使 java 与 C/C++ 一样好。 Java 现在不慢了。但我不会在 c/c++ 上快速调用它。由于语言改进以及更好的硬件,实际应用程序开发中的任何差异都可以忽略不计。

  2. 您不能通过在特定环境中使用特定算法或代码击败它一次来概括 java 比 c/c++ 快。

您可能会在以下 link 中找到一些有趣的信息

  1. https://softwareengineering.stackexchange.com/questions/110634/why-would-it-ever-be-possible-for-java-to-be-faster-than-c

  2. Is Java really slow?

由于问题已被编辑为现在尝试发现使用 JIT 的性能改进,我正在编辑我的答案以添加更多要点。

我对 JIT 的理解是,它改进了执行次数最多的代码,使编译器可以运行 非常快地执行代码。我遇到的大多数 JIT 优化技术示例显示的操作也可以由程序员完成,但会影响程序的可读性,或者可能无法确认程序员 is/has 使用的框架或编码风格.

所以我在这里想说的是,如果您编写的程序可以通过 JIT 进行改进,那么它就会这样做,并且您会看到性能的提高。但是,如果您是了解 JVM 并编写 java 已经优化过的代码的人,那么 JIT 可能不会给您带来太多好处。

因此,如果您在 运行 使用 JIT 运行程序时看到性能改进,那么实际上并不能保证所有 java 程序都有改进。这取决于程序。

下面这些 link 显示了一些使用代码示例的 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 的 运行 相同的程序。

此 link http://www.javacodegeeks.com/2013/07/java-just-in-time-compilation-more-than-just-a-buzzword.html 有关于此主题的案例研究,并推荐以下内容

评估 JIT 对您的应用程序的好处

为了了解不对您的 Java 应用程序使用 JIT 的影响,我建议您进行以下实验:

  1. 在启用 JIT 的情况下为您的应用程序生成负载并捕获一些基线数据,例如 CPU%、响应时间、请求数等

  2. 禁用 JIT

  3. 重做相同的测试并比较结果。

此 link http://people.cse.iitd.ac.in/~sbansal/csl862-virt/readings/CompileJava97.pdf 对 JIT 进行基准测试,并显示相对于基本 JVM 解释的速度改进。

要了解 JIT 对代码的作用,您可以使用 JITwatch 工具。

https://github.com/AdoptOpenJDK/jitwatch

下面的 link 解释了它的实用性。

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/

Stack Overflow 上有无数的例子,例如 "why is my code running faster all of a sudden?" - 通常是人们尝试对他们的代码进行基准测试时。答案总是,因为 JIT 能够在基准测试中进行优化。

有关示例,请参阅:How do I write a correct micro-benchmark in Java?, What is going on in this java benchmark?, and Java benchmarking - why is the second loop faster?

I have only ever read about the JIT and wish to prove it's existence as opposed to just believing in it like some sort of religious God.

这是一个不必要的思路; 很多 在您的键盘和显示器之间发生着您从未注意到或不理解的事情。 JIT 是 JVM 的记录行为,这就是您需要知道的全部内容。如果你不理解它并想了解更多也没关系,但这不是一些神话般的空灵结构。