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内置),我已经看到,在它们之间没有性能的改善。也许函数调用的开销已经是非常低的。

注意:我用盒,用于评估性能的模糊算法

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top