Are there inline functions in java?

Java 中是否存在内联函数的概念,或者它的替代品是什么?如果有,如何使用?我听说 publicstaticfinal方法是内联函数。我们可以创建自己的内联函数吗?

133540 次浏览

你上面说的是对的。有时候 final 方法是以内联方式创建的,但是没有其他方法可以在 java 中显式创建内联函数。

In Java, the optimizations are usually done at the JVM level. At runtime, the JVM perform some "complicated" analysis to determine which methods to inline. It can be aggressive in inlining, and the Hotspot JVM actually can inline non-final methods.

Java 编译器几乎从不内联任何方法调用(JVM 在运行时完成所有这些工作)。它们执行内联编译时间常量(例如,最终静态基元值)。但不是方法。

更多资源:

  1. 文章: JavaHotSpot 性能引擎: 方法内联示例

  2. Wiki: Inlining in OpenJDK, not fully populated but contains links to useful discussions.

Java 没有提供一种手动建议方法应该内联的方法。正如@notnoop 在注释中所说,内联通常由 JVM 在执行时完成。

不,爪哇没有 内联函数内联函数。是的,当放置在公共类中时,可以在代码中的任何位置使用公共静态方法。Java 编译器可以对静态方法或 final 方法执行 内嵌式扩展,但这是不能保证的。

Typically such code optimizations are done by the compiler in combination with the JVM/JIT/HotSpot for code segments used very often. Also other optimization concepts like register declaration of parameters are not known in java.

优化不能通过 Java 中的声明强制执行,而是由编译器和 JIT 完成。在许多其他语言中,这些声明通常只是编译器提示(您可以声明比处理器拥有更多的寄存器参数,其余的被忽略)。

声明 java 方法静态、 final 或 private 也是编译器的提示。你应该用它,但不能保证。Java 的性能是动态的,而不是静态的。由于类加载,对系统的第一次调用总是很慢。接下来的调用会更快,但是根据内存和运行时的不同,最常见的调用会在运行系统中进行优化,因此服务器在运行时可能会变得更快!

现实生活中的例子:

public class Control {
public static final long EXPIRED_ON = 1386082988202l;
public static final boolean isExpired() {
return (System.currentTimeMillis() > EXPIRED_ON);
}
}

然后在其他类中,如果代码过期,我可以退出。如果我从另一个类引用 EXPIRED _ ON 变量,这个常量将内联到字节代码中,这样就很难跟踪代码中检查到期日期的所有位置。但是,如果其他类调用 isExpired ()方法,则会调用实际的方法,这意味着黑客可以用另一个始终返回 false 的方法替换 isExpired 方法。

我同意强制编译器将静态 final 方法内联到所有引用它的类是非常好的。在这种情况下,甚至不需要包含 Control 类,因为在运行时不需要它。

根据我的研究,这是不可能的。也许一些 Obfuscator 工具可以做到这一点,或者,您可以修改您的构建过程,以便在编译之前编辑源代码。

至于证明来自控件类的方法是否在编译期间内联到另一个类,请尝试在类路径中运行没有 Control 类的另一个类。

在 java 中,有些方法可以称为“ inline”方法,但这取决于 jvm。在编译之后,如果方法的机器码小于35字节,它将立即被传输到一个内联方法,如果方法的机器码小于325字节,它可以被传输到一个内联方法,这取决于 jvm。

因此,它似乎不存在,但您可以使用这种变通方法使用番石榴或一个等效的函数类实现,因为该类是非常简单的,例如:

    assert false : new com.google.common.base.Function<Void,String>(){
@Override public String apply(Void input) {
//your complex code go here
return "weird message";
}}.apply(null);

是的,这是死代码,只是为了举例说明如何创建一个复杂的代码块(在{}中)来做一些特定的事情,不应该打扰我们为它创建任何方法,即内联!

Java9有一个“提前”编译器,可以在编译时而不是运行时进行一些优化,这可以看作是内联。