我在循环中反复使用以下代码行:
Object val;
while (logic())
val = val == null ? generateObj() : val;
我很好奇JVM如何优化这段代码,如果有的话?也就是说,如果val != null
将JVM意识到赋值返回自己并且只是忽略该行的其余部分,或者是否需要花时间将val
的引用复制回自身?
我在Windows 7环境中运行标准JRE 6和JRE 7.
ASIDE:
如果JVM没有很好地优化此操作,那么执行此调用的最佳替代方法是什么?只需if (val == null) val = generateObj();
?
答案 0 :(得分:1)
Java是一种解释型语言。 Java主要在运行时进行优化。生成的字节码通常完全未经优化。只有当JVM执行字节码时,它才会开始优化,具体取决于代码的执行方式。因此,如果您的循环只运行了几次,那么JVM可能不会优化任何内容。你永远无法确定JVM是否会优化某些东西。它还取决于具体的JVM实现。所以你永远不要依赖它。
答案 1 :(得分:1)
好奇?选择一些JVM(它们的列表在这里可用:http://en.wikipedia.org/wiki/Java_Virtual_Machine),源代码打开并转到JIT编译器的调试输出。
我不知道特别是Oracle JVM的内部(你可能在Windows上运行的那个)是开源的,但也许他们的工程师可能会清楚地回答你的问题,特别是如果你提出性能问题ticket(我曾经解决过这种Symbian JVM的门票(其中有2个),我们有工具来详细诊断这类东西。)
一般来说,现代Java如何优化某些东西的问题没有一般简单的答案。恕我直言了解更多信息的最佳方法是选择一个并使用它(运行基准测试,研究痕迹等)。
如果你问如何编写更好的代码,那么这个 - super cool Stack Overflow answer - 可以给你一些提示
编辑:是否有设置JDK从C编译器编译Java代码的指南? (理想情况下是日食设置)
是的,应该有一个。请注意,使用较大的软件存储库(数千个文件和数十万到数百万行代码)通常不适合胆小的人,并且正确设置环境(即使有一些文档)可能需要几天时间
Wikipedia - List of Java virtual machines列出了一些开源JVM。 Oracle JVM页面指向OpenJDK - the The HotSpot Group,您可以在其中找到一些(大量)资源和指南,但主要是与能够帮助您启动和运行的开发人员建立的宝贵联系。
(我无法为您提供更准确的说明,因为我已经离开JVM和Symbian OS业务近5年了,事情发生了一些变化......)