【发布时间】:2012-06-05 11:06:33
【问题描述】:
JIT 在 10k 次调用后进行方法优化(-XX:+PrintCompilation),您可以使用 -XX:CompileThreshold 对其进行配置。我读到不降低该阈值的原因是 JIT 优化可能是错误的,或者您优化了不经常使用的代码。我有几个关于这个领域的问题:
- 我认为错误的优化(即:堆栈替换)是由于多态方法的延迟类加载。但是在找到 3 个实现(我认为)之后,JVM 只是进行索引表查找。当然,如果你有更多的多态 impl,速度会受到影响。多态方法是错误 JIT 优化的唯一原因还是主要原因?如果不是,其他是什么?
- 如果我可以在启动时强制加载所有类,以便 JVM 可以预先构建此类索引表,那么预先进行整体优化不是更好吗?优化所有方法有什么问题?如果我的目标只是速度,成本是多少?
- 与 C++ 相比,如果我的源代码已关闭,这意味着没有 3rd 方库,就像那个低延迟系统一样,有没有办法强制预先优化以提高性能以更接近 C++?
- Peter Lawrey 在他的 oracle 杂志文章中提到,您可以通过在生产中人为地运行足够的测试数据以满足阈值来启动 JIT。这样做在生产环境中似乎很危险,而且你会被解雇。必须有更好的方法以最小的风险来做到这一点。
- 非常感谢有关此主题(涉及 java 和 c++)的任何好的参考。
更新:#3。永远不要期望 java 比 c++ 快,只想更接近。
【问题讨论】:
-
C 和 C++ 的哲学是,“如果你搞砸了,你的代码可能不会做你认为它会做的事情”。 Java/C#/Python/大多数其他语言说,“如果你做错了什么,我会给你一个错误,这样你就可以处理这种情况”。这个非常的事实意味着Java天生比C++做更多的工作——而且,在对性能敏感的情况下,这可能会产生很多的不同。
-
我怀疑@PeterLawrey 是否真的这么说,但我会让他发表评论。
-
您可以通过运行足够多的循环来触发 JIT。这就是运行微基准测试的方式。 Cliff 还建议,否则你测量的是错误的东西。
标签: java performance jit