我正在将一些C ++代码转换为Java,我想知道我可以对内联函数做些什么。我是否可以假设VM将内联函数(必要时)并且不用担心这个问题?如何配置以观察此行为?假设有一个主要的外部函数,我在它周围抛出一个for循环并导致一百万个调用。当VM越来越多地内联时,我是否应该期待看到改进?
答案 0 :(得分:4)
是Java执行内联方法调用。内联由JIT编译器执行,因此您不会通过检查字节码文件来查看它。
对于给定的方法调用,实际上是否实际内联将取决于方法主体的大小以及调用是否可内联。 (如果方法调用涉及调度...在JVM有一堆全局优化设计用于删除不必要的调度之后......那么它就不能内联。)
这同样适用于您的外部主要功能的示例。这取决于方法体的大小。另一方面,如果该方法需要很长时间才能执行,那么优化的相对重要性会相应降低。
我的建议是在这个阶段不要担心这样的事情。只需清楚简单地编写代码,让JIT编译器处理优化问题。当您的应用程序正常运行时,您可以对其进行分析,并查看代码中是否存在值得手动优化的“热点”。
但我应该可以在Visual VM这样的东西中看到这个吗?我的意思是最初没有内联,然后越来越多的东西被内联,所以外部方法的平均时间略有减少。
它可能是可观察的,也可能不是,这取决于相对于执行方法体而进行调用所花费的时间。 (分析通常依赖于对程序计数器进行抽样。如果给定代码区域的样本数量太小......以及其他原因,报告的时间可能不准确。)
它还取决于您使用的JVM。并非所有JVM都会重新优化他们之前优化过的代码。
最后,有一种方法可以让JVM转储JIT编译器输出的本机代码。如果您准备阅读机器说明,那将为您提供关于已内联内容的明确答案。