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