【问题标题】:A concrete Example of the effect of the JIT in javajava中JIT效果的一个具体例子
【发布时间】:2015-09-23 03:04:28
【问题描述】:

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

备注 - 如果这个问题太自以为是,请发表评论并告诉我原因。我只是对 JIT 感到好奇,并且在使用 java 几年后,直到今天我仍然不知道我如何从中受益,以及它是否能够达到优于静态编译对应物的炒作。

其他信息 - 我已阅读有关它何时执行的信息,并且我不是在寻找更多信息,我只需要相信它是真实的,我想看到一些可以显示我正在做什么的东西假设这样做。

编辑 - 很好,我已经分配了响应,有人说单独比较 JIT 优化与 C++ 的速度不是一个好方法,纯粹的 java 比较是最少的可怕。用 java 展示这个的例子怎么样:

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

【问题讨论】:

  • 也许这个beyondjava.net/blog/… 是这样的,但这个例子只包含原语......我理想情况下我希望 GC 也参与其中。
  • 您可以通过比较带有和不带有-Xint 的java 对您感兴趣的任何事物的影响来研究JIT 的效果。但请注意,由于 GC 的影响,Java 的微基准测试是变化无常的,即使您排除了 JITing。
  • 有些人会说“编译一次,随处运行”是 JIT 技术的更大好处,而不是你能以微秒的速度击败 C 或 C++。请注意,Java 运行时发生的大部分事情无论如何都是用 C 编写的,那么您要证明 Java 在这个或那个算法上是更快还是更慢?
  • -xint 运行一个程序来禁用jit,看看它的性能是如何受到影响的。性能的任何变化都必须是由于 jit(或缺乏)。确保首先阅读有关在 Java 上编写良好基准的内容(这不是微不足道的)。至于具体的 jit 优化,我在 github 上有一个你可能会觉得有趣的 repo:github.com/yshavit/jitperf

标签: java jit


【解决方案1】:

我认为你不能令人信服地证明使用 JIT 的 java 比 C/C++ 静态编译的代码更快。

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

由于我的以下观点,我故意不提及上述任何代码或链接。

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

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

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

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

总结(在现实生活中的应用开发中)

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

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

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

  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 优化技术示例都显示了程序员也可以完成的操作,但随后会影响程序的可读性,或者可能无法确认程序员现在/必须使用的框架或编码风格。

所以我在这里想说的是,如果你编写一个可以通过 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 对您的应用程序的好处

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

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

  2. 禁用 JIT

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

此链接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/

【讨论】:

  • 感谢 cmets,但对 java 与 c++ 的基准测试并不真正感兴趣,而只是 JIT 本身。如果将 java 与 c++ 进行比较不是查看 JIT 运行的好方法,我将尝试其他方法。
【解决方案2】:

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

我认为您的问题被误导的地方是您要求提供定制代码的示例,您可以在其中潜在地衡量某些基于 JVM 的语言 X 与某些非基于 JVM 的语言 Y(例如,X是 Java,Y 是 C)。

这不是考虑 JIT 的方式。除非您实际上自己为 JVM 语言编写了编译器,或者必须调试一些严重的性能问题,并且只有在您考虑重构代码并看到代码失败之后,否则您可以深入研究细节.

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

【讨论】:

  • 是的,我希望 JIT 成为我的朋友,但它就像一个我无法直接观察到的超自然生物,只能在文献中阅读,然后使用我阅读的信息来解释有关的事情我不明白的java。就像人类过去没有好的科学时所做的那样。
  • 那么请观看我链接的视频并开始播放:)
  • 我想但是我在工作):另外我没有带我的耳机,否则我会逃脱它(;但我会告诉你我是如何找到视频的看过了。
  • JIT不是超自然的,可以直接观察。请停止将长期存在的 JVM 功能与神秘的神进行比较。
  • 但我觉得这是一个有用的类比
【解决方案3】:

在 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 的行为,这就是您需要知道的全部内容。如果您不了解它并想了解更多信息,这很好,但它不是什么神秘的、空灵的结构。

【讨论】:

  • 明白,不喜欢这样,如果可能的话,仍然希望以可衡量的方式看到它,如果不可能,那么悲伤的脸):
  • 运行任意数量的简单基准测试,就像链接的问题试图做的那样。当重复运行相同的代码在连续迭代中花费更少的时间时,您将“看到” JIT 的效果。
  • 我认为这还不足以证明这一点。你需要像我的图片显示的那样吗?否则优化可以用其他因素来解释,例如 jvm 线程在开始时没有抓住它想要的所有 CPU 并在维持其业务时得到它想要的东西,这可能吗?
  • 要求 JVM 功能的“证明”很奇怪。 well documented 存在,我们不是在这里进行考古挖掘。
  • 如果你想要证明,文档就足够了。如果您想看到它的实际效果,请运行基准测试。
【解决方案4】:

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

“理论上,只要调用 Java 方法,JIT 就会开始使用, 并将该方法的字节码编译为本机机器码, 从而“及时”编译它以执行“

JIT 最可靠的效果是比较 java 本身有和没有 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 和具有相同 jdk 和相同 jvm 的 java 之间也可能存在差异,具体取决于编译参数和执行参数。

不能说Java比C快,反之亦然,这种比较涉及的参数太多。有时 C++ 更快,有时 java 是最好的。

这里是 Oracle 关于 JIT 编译的参考:http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit.html

【讨论】:

  • "JIT 即时编译是一种在执行字节码之前完成的预编译。" - 这是不正确的。
  • 来自 oracle 网站:理论上,只要调用 Java 方法,JIT 就会开始使用,并将该方法的字节码编译为本机机器码,从而“及时”编译以执行
  • 是的,但是这个短语是针对 AOC 的,JIT 在代码运行之后发生,然后在下次运行之前进行优化。不是在它运行之前。
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2015-03-17
  • 1970-01-01
相关资源
最近更新 更多