题
C++我可以声明的方法"的内联"和编译是可能的内联。据我了解,没有这样的关键词。
内联样做是如果JVM决定这样做?我可以影响这一决定以某种方式?
解决方案
一对夫妇的其他答案的建议,只有最后的方法可以被内联 - 这是不正确的,因为热点是足够聪明,能够内联非最终方法,只要他们还没有被覆盖的但。当一个类被装载,其覆盖方法,它可以撤消其优化。显然,使得该从来没有要求的方法,最终的平均...
基本上让JVM做的工作 - 这很可能是在制定好了很多,其中内联比你
。你有一个情况下,你已经确信的JVM是不是做一个好工作?您正在使用HotSpot的假设,你尝试过使用服务器版本,而不是客户端?这可以使的巨大的差异。
其他提示
虽然Java编译器可以做的内联(对于短早期绑定方法)的实强>内联将由JIT编译器完成的。 在JIT(热点)编译器将能够甚至,内联的虚拟方法。 与它进行交互的最佳方式是写一个简单和简洁的代码。 最有可能的,使用反射代码将不会允许内联。
希望有所帮助。
'在C ++中我可以声明的方法‘内联’和编译器将内联它 ...或没有。编译器是免费的,使函数内联与否,你不能真正影响的结果。它只是一个提示给编译器。
在Java中没有这样的事情,编译器(和后来的VM,同时执行优化)可以决定“内联”的方法。
请注意最终方法具有的被内联(编译器不能内联非最终方法,因为它们可能在派生类被覆盖)更大的机会。随着现代VM,类似的优化可以在运行时进行。 VM将旗类型(因此它可以执行类型检查),并且将内联的代码。只有如果检查失败,它将落回到原始未优化的多态的方法调用。
内联,是更有可能发生,如果方法在的问题是:
- 短
- 最终
- 不依赖于任何长期的,无最后的方法
作为这是唯一的情况下JVM可以肯定的影响的呼吁。
class A {
final int foo() { return 3; }
}
鉴于这一类中,任何呼吁foo()可以被替换为恒定的"3".任何Java1虚拟机可以做到这一点,因为 最终 关键词明确地规定,它不可能有一个子类,将复盖"int foo()".
内联的方法提供了下列好处在电话网站:
- 没有方法的呼叫
- 没有动态调度
- 可能恒定的倍的价值,例如。"一个.foo()+2"5变成没有执行的代码在
运行时间。
在过去,经常程序员插入的 最终 关键词正是这个原因.或者以更好地促进内联和增加执行速度,他们将许多较小的方法进入到一个较大的方法。但在许多方面,这类技术失败的整个设施的模块化和可重复使用性建进入编程语言。
现代JVM,像Java热点虚拟机能的内联类没有 最终.关键词**.
(http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html)
阅读此为内联的行为。 http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++ andjava.html
它说Final方法可以被内联,但并非总是如此。
是的,如果JVM决定去做,就可以了。的方式来影响包括设置方法为静态或作为最终
当然,关于它的最重要的是,该方法的结构需要在线友好。短期帮助,但最重要的是它仅需要使用它的局部变量及其参数没有字段,和最小的方法调用同一类的其他方法。
然而,你不应该过早地做这样的优化,你实际上可以使事情变得更糟(因为你可能是短路等潜在的优化)。 JVM将有时意识到,一个方法可以在没有这些提示被内联。
当进行比较的正常功能和最终功能(这被认为是由JVM内置),我已经看到,在它们之间没有性能的改善。也许函数调用的开销已经是非常低的。
注意:我用盒,用于评估性能的模糊算法