Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

GraalでAOTする

GraalでAOT(Ahead Of Time)コンパイルしました。GraalはJava 9でのAOT実装としても使われています。Java 9ではLinuxのみjaotcコマンドがありAOTコンパイルできますが、GraalではMacでもできました。バイトコードをマシンコードにするのがJITコンパイルである以上、これをAOTの実装としても利用できるというのはイメージしやすいです。

実行時間も計測してみるため、サンプルとして以下のコードを使います。

import java.math.BigInteger;

public class Factorial {

    public static BigInteger factorial(int n) {
        BigInteger p = BigInteger.valueOf(1);
        while (n > 0) {
            p = p.multiply(BigInteger.valueOf(n));
            n = n - 1;
        }
        return p;
    }

    public static void main(String[] args) {
        System.out.println(factorial(Integer.parseInt(args[0])));
    }
}

javaコマンドで実行してみます。

$ time java Factorial 100
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
java Factorial 100  0.08s user 0.03s system 88% cpu 0.118 total

さて、AOTコンパイルしてネイティブイメージを作ります。

$ export PATH=[graalvm-0.28.2]/bin:$PATH

$ native-image -H:Name=fac -H:Class=Factorial
   classlist:   1,967.73 ms
       (cap):   1,656.13 ms
       setup:   2,947.44 ms
  (typeflow):   3,652.14 ms
   (objects):   1,199.91 ms
  (features):      11.76 ms
    analysis:   5,002.74 ms
    universe:     397.06 ms
     (parse):   1,028.24 ms
    (inline):   1,949.47 ms
   (compile):  12,080.05 ms
     compile:  15,468.37 ms
       image:   2,879.35 ms
   debuginfo:   1,001.58 ms
       write:   5,711.16 ms
     [total]:  34,449.74 ms

native-imageコマンドで作れます。Nameに指定した値がファイル名となります。Classは対象のクラスです。

$ ls -lat
...
-rwxr-xr-x   1 jyukutyo  jyukutyo  6844468 12 19 19:36 fac

$ time ./fac 100
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
./fac 100  0.00s user 0.01s system 66% cpu 0.014 total

こういった短時間で終わる処理は早くなります。サーバレスと相性がよさそうです!