【问题标题】:When does java JIT have wrong optimization?java JIT什么时候优化错误?
【发布时间】:2012-06-05 11:06:33
【问题描述】:

JIT 在 10k 次调用后进行方法优化(-XX:+PrintCompilation),您可以使用 -XX:CompileThreshold 对其进行配置。我读到不降低该阈值的原因是 JIT 优化可能是错误的,或者您优化了不经常使用的代码。我有几个关于这个领域的问题:

  1. 我认为错误的优化(即:堆栈替换)是由于多态方法的延迟类加载。但是在找到 3 个实现(我认为)之后,JVM 只是进行索引表查找。当然,如果你有更多的多态 impl,速度会受到影响。多态方法是错误 JIT 优化的唯一原因还是主要原因?如果不是,其他是什么?
  2. 如果我可以在启动时强制加载所有类,以便 JVM 可以预先构建此类索引表,那么预先进行整体优化不是更好吗?优化所有方法有什么问题?如果我的目标只是速度,成本是多少?
  3. 与 C++ 相比,如果我的源代码已关闭,这意味着没有 3rd 方库,就像那个低延迟系统一样,有没有办法强制预先优化以提高性能以更接近 C++?
  4. Peter Lawrey 在他的 oracle 杂志文章中提到,您可以通过在生产中人为地运行足够的测试数据以满足阈值来启动 JIT。这样做在生产环境中似乎很危险,而且你会被解雇。必须有更好的方法以最小的风险来做到这一点。
  5. 非常感谢有关此主题(涉及 java 和 c++)的任何好的参考。

更新:#3。永远不要期望 java 比 c++ 快,只想更接近。

【问题讨论】:

  • C 和 C++ 的哲学是,“如果你搞砸了,你的代码可能不会做你认为它会做的事情”。 Java/C#/Python/大多数其他语言说,“如果你做错了什么,我会给你一个错误,这样你就可以处理这种情况”。这个非常的事实意味着Java天生比C++做更多的工作——而且,在对性能敏感的情况下,这可能会产生很多的不同。
  • 我怀疑@PeterLawrey 是否真的这么说,但我会让他发表评论。
  • 您可以通过运行足够多的循环来触发 JIT。这就是运行微基准测试的方式。 Cliff 还建议,否则你测量的是错误的东西。

标签: java performance jit


【解决方案1】:

有没有办法预先强制优化以提高性能 比c++更好?

不。这是 Java 规范中强制执行的语义和 JVM 生态系统工作方式的一个基本限制,假设实现和代码质量相同,它将比 C++ 实现慢。请查看my existing answer on this subject 了解更多详情。

【讨论】:

  • 确实不能让Java“预先”优化,但它并没有遵循根本这使得它比C++慢。也许是现在,但这种说法并没有得到充分证实,因此在未来一定会成立。
  • @Louis:这与预先优化无关,一切都与以下事实有关:一是 JIT 几乎没有任何时间和空间可以运行,二是语言语义强制它必须变慢,正如我在链接答案中详细讨论的那样。
  • @DeadMG,您现有的答案有道理。我意识到在评估应用程序时不能将正确性、延迟和吞吐量分开。否则我们都需要在汇编中编程。但是java能否通过各种优化手段接近c++呢?
猜你喜欢
  • 2010-10-16
  • 2021-05-06
  • 2011-05-29
  • 1970-01-01
  • 2010-09-27
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
相关资源
最近更新 更多