java - 为什么这个代码片段在使用热点服务器 JVM 运行时实际上需要更长的时间?

标签 java jvm-hotspot

这是代码片段:

https://gist.github.com/987751

对我来说,有时会这样:

java -client:
  for loop took:     23
  method call took:  19

java -server:
  for loop took:     0   # faster, as expected
  method call took:  48  # slower--expected?

所以第一个问题是“为什么它比客户端虚拟机慢”

而且我猜下一个问题是“是否有可能为方法调用方式获得 super 0ms 的加速(几乎相同的代码)?”

我还认为,尽管有这种奇怪的情况,热点通常运行得更快,即使使用匿名类等?

谢谢!

-罗杰-

最佳答案

这都是关于如何调整 Hotspot 的两种风格的:

  • 客户端已针对快速(呃)启动进行了调整。它“几乎”立即进行 JIT 编译方法。

  • 服务器在假定为长调整服务器实例的生命周期内进行了调整,以实现更高的吞吐量。它让解释器在 JIT 编译方法之前运行方法的时间更长(收集使用情况统计信息)。然后(我相信)它会执行更积极的优化......这需要更长的时间。

相关答案:Real differences between "java -server" and "java -client"?

顺便说一句,它是运行客户端和服务器模式的同一个 Hotspot JVM。 AFAIK,差异是由于两种模式选择不同的默认 JVM 调整/配置参数造成的。

<小时/>

So the first question would be "why is it slower than the client VM"

我不知道。

也许客户端模式可以实现特定的优化,真正有助于这个(高度人为的)基准测试。或者也许服务器模式优化之一实际上是针对此(高度人为的)基准测试的反优化。如果你真的想知道,请让 JIT 编译器转储 native 代码并详分割析它。 (但我认为这是浪费时间。)

Also I guess the next question would be "is it possible to get that super 0ms speedup for the method call way (it's almost the same code)?"

这很容易。优化器发现该方法调用不会影响其他任何内容,并优化了该调用。然后循环也可以被优化掉。

Also I presume that despite this weirdness, hotspot in general runs much faster, even with, say, anonymous classes et al?

我认为你不应该假设任何事情。

但是,我也不认为您的微基准测试对实际程序有任何意义。一般来说,微基准往往会产生误导,而您的微基准是有缺陷的(例如,被优化掉的循环),并且似乎没有测试典型(编写良好的)Java 程序会做的事情。

如果您确实关心 HotSpot 两种模式的相对性能,则应该在实际数据上运行并测量应用程序的性能。

... and why would the server JVM choose something seemingly worse?

优化器旨在优化实际程序......而不是花时间做奇怪事情的微基准,这些事情与有用的计算没有任何相似之处。并非所有优化在所有情况下都有益,您可能遇到了某种边缘情况。

但只有当您在实际应用程序中看到同样的事情发生时,这才有意义。

<小时/>

最后,您没有提供 JVM 版本、平台和硬件的任何详细信息。这些事情可能会对相对绩效指标产生巨大影响。

关于java - 为什么这个代码片段在使用热点服务器 JVM 运行时实际上需要更长的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6103885/

相关文章:

java - Java JIT 在运行 JDK 代码时会作弊吗?

java - ReservedCodeCacheSize 和 InitialCodeCacheSize 是什么?

java - java中已提交内存的确切状态

java - 如何使用覆盖率对 void 函数进行单元测试

java - 使用 Java 的 Selenium WebDriver 多线程和浏览器隐藏

java - 如何在pom.xml中设置Jmeter home?

java - 从 JPEG 数据到完整的 JPEG 文件

java - 问题 当我使用 @Named 注释时,如果没有 @Provides 注释的方法,则无法提供 Dagger

java - 如何用 Java 编写正确的微基准测试?

java - 修改 rt.jar 的限制