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