HOWTO · Java

Javaインライン関数

このチュートリアルでは、Java でインライン関数を実装する方法を示します。

このチュートリアルでは、Java でインライン関数を実装する方法を示します。

Javaインライン関数

コンパイラが関数のコードをコピーして任意の場所に配置すると、インライン関数と見なされます。 インライン関数のコードを変更すると、コンパイラはコピーされたすべてのバージョンのコードを変更する必要があります。

HotSpot JVM ジャストインタイム (JIT) コンパイラは、デフォルトで有効になっているインライン化を含む多くの最適化を実行できます。次のフラグを使用して、JVM でインライン化を有効または無効にできます。

-XX:+Inline (+ means true, which enables the inlining)
-XX:-Inline (- means false, which disables the inlining)

Java はインライン関数を提供しませんが、JVM は実行時にこの操作を実行します。 コンパイラが実行するので、Java でインライン関数を使用する必要はありません。

それがどのように機能するかを理解するために、Java でインライン関数機能を作成してみましょう。 例を参照してください。

package delftstack;

public class Inline_Example {
  public static final class Points {
    private int a = 0;

    private int b = 0;

    public int getA() {
      return a;
    }

    public void setA(int a) {
      this.a = a;
    }

    public int getB() {
      return b;
    }

    public void setB(int b) {
      this.b = b;
    }

    @Override
    public String toString() {
      return String.format("%s[a=%d, b=%d]", getClass().getSimpleName(), a, b);
    }
  }

  public static void main(String[] args) {
    final Points NotInlinedPoints = new Points();
    NotInlinedPoints.setA(NotInlinedPoints.getA() + 2);
    NotInlinedPoints.setB(NotInlinedPoints.getA() * 6 / 2);

    final Points InlinedPoints = new Points();
    InlinedPoints.a = InlinedPoints.a + 2;
    InlinedPoints.b = InlinedPoints.a * 6 / 2;

    System.out.println("The Non Inlined Points " + NotInlinedPoints);
    System.out.println("The Inlined Points " + InlinedPoints);
  }
}

上記のコードは、メソッドのインライン展開を示しています。 コードに示すように、最適化が実行され、メソッド呼び出しが単純なステートメントに置き換えられます。

出力に示すように、NotInlinedPointsInlinedPoints の両方が同じ操作を実行しています。

The Non Inlined Points Points[a=2, b=6]
The Inlined Points Points[a=2, b=6]

ここでわかるように、Java でインライン関数を宣言してインライン化を実行する必要はありません。 JVM は、バックグラウンドでいくつかの複雑な構造を使用してそれを行います。

デフォルトでは、インライン化は JVM で有効になっています。 上記のフラグを使用してインライン化を無効にして、コードを実行してみましょう。

上記のコードを cmd で実行します。

C:\Users\DelftStack>javac Inline_Example.java
C:\Users\DelftStack> Java -XX:-Inline Inline_Example.java
The Non Inlined Points Points[a=2, b=6]
The Inlined Points Points[a=2, b=6]

ご覧のとおり、インライン化を無効にした後、コードは結果に違いを示していませんが、このコンパイルではプロセス ID と経過時間が長くなります。