在C++中,我可以声明一个方法为"inline",编译器可能会将其内联。据我所知,在Java中没有这样的关键字。
如果JVM决定这样做,就会进行内联处理吗?我能以某种方式影响这个决定吗?
在C++中,我可以声明一个方法为"inline",编译器可能会将其内联。据我所知,在Java中没有这样的关键字。
如果JVM决定这样做,就会进行内联处理吗?我能以某种方式影响这个决定吗?
其他答案中有一些人提到只有final方法才能被内联,但这是不正确的。HotSpot聪明到可以内联非final方法,只要它们还没有被覆盖。
当加载一个覆盖该方法的类时,它会取消内联优化。显然,将该方法变成final意味着永远不需要执行此操作...
基本上让JVM完成其工作 - 它很可能比您更擅长在哪里进行内联。
您是否遇到了JVM无法很好地运行的情况?假设您正在使用HotSpot,您是否已尝试使用服务器版本而不是客户端版本?这可能会产生巨大的差异。
如果涉及的方法:
在这些情况下,虚拟机更有可能进行内联操作。因为只有在这种情况下JVM才能确定调用的效果。
final
对于 HotSpot 没有任何影响。 - Tom Hawtin - tacklineclass A {
final int foo() { return 3; }
}
(http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html)
是的,如果JVM决定这样做,它可以进行内联优化。影响方式包括将方法设置为静态或final。
当然,最重要的是该方法的结构需要对内联友好。短小有助于内联优化,但更重要的是它只能使用局部变量和参数,不能使用字段,并且对同一类中的其他方法的调用应尽量减少。
然而,您不应过早地进行此类优化,因为您实际上可能会使情况变得更糟(因为您可能会绕过其他潜在的优化)。JVM有时会意识到无需这些提示就可以内联方法。
当比较普通函数和最终函数(JVM称之为内联函数)时,我发现它们之间没有性能提升。也许函数调用的开销已经非常低了。
注意:我使用盒状模糊算法来评估性能。