GraalVMを試してみました

遅まきながら、GraalVMのサイトのGetting Startを試してみました。

Getting started with GraalVM

試してみるようdockerイメージが用意されています。Docker Desktopをインストール済みであればこれを使うのが簡単です。

サイトには、Node、RubyPythonを使ったサンプルもありますがまずはJavaで試してみました。

手順

# docker image取得
$ docker pull oracle/graalvm-ce:19.1.1

# docker imageに接続
$ docker run -it oracle/graalvm-ce:19.1.1 bash
bash-4.2# 

# 気持ち的にrootにファイルは作成しにくい
bash-4.2# cd home

# "Hello Word!"を出力するjavaファイル作成
bash-4.2# vi HelloWorld.java

bash-4.2# cat HelloWorld.java
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }
}

bash-4.2# javac HelloWorld.java
bash-4.2# java HelloWorld
Hello, World!

# native-imageを作成
# デフォルトでは入っていないのでダウンロードする
bash-4.2# install native-image
bash-4.2# native-image HelloWorld
bash-4.2# ./helloWorld
Hello, World!

# バイナリをhexdumpする
# elfファイルになっている。
bash-4.2# hexdump -C helloworld | head
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  00 10 40 00 00 00 00 00  |..>.......@.....|
00000020  40 00 00 00 00 00 00 00  d0 0c 23 00 00 00 00 00  |@.........#.....|
00000030  00 00 00 00 40 00 38 00  09 00 40 00 26 00 25 00  |....@.8...@.&.%.|
00000040  06 00 00 00 05 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
00000050  40 00 40 00 00 00 00 00  40 00 40 00 00 00 00 00  |@.@.....@.@.....|
00000060  f8 01 00 00 00 00 00 00  f8 01 00 00 00 00 00 00  |................|
00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................|
00000080  38 02 00 00 00 00 00 00  38 02 40 00 00 00 00 00  |8.......8.@.....|
00000090  38 02 40 00 00 00 00 00  1c 00 00 00 00 00 00 00  |8.@.............|

# ファイルサイズ
bash-4.2# ls -l
total 2256
-rwxr-xr-x 1 root root 2299472 Jul 21 01:23 helloworld
-rw-r--r-- 1 root root     427 Jul 21 01:20 HelloWorld.class
-rw-r--r-- 1 root root     116 Jul 21 01:20 HelloWorld.java

# 実行時間
bash-4.2# time ./helloworld
Hello, World!

real    0m0.002s
user    0m0.000s
sys 0m0.000s
bash-4.2# java HelloWorld
Hello, World!
bash-4.2# time java HelloWorld
Hello, World!

real    0m0.076s
user    0m0.060s
sys 0m0.000s

以下の記事はJavaフレームワークをnative-imageで起動した結果です。今後の動きから目が離せません。

きしだのHatena

あと、同じ著者が書いたこの記事も参考になります。 native-imageとJITは同程度だと思っていたのですが、JITの方がこんなに早いとは思いませんでした。

GraalVMはどれだけ遅いか - きしだのHatena