GraalVMを試してみる。

f:id:hamo2020:20200828170810j:plain
マネックス証券 システム開発部のHです。

はじめに

GraalVMってご存じでしょうか?
Wikipediaを見ると「HotSpot/OpenJDKに基づくJavaで実装されたJavaVM、JDKです。」とあります。
また、「高速起動と低メモリフットプリントのための事前コンパイルや追加のプログラミング言語と実行モードもサポートします。」ともあります。 Google翻訳ですが。
簡単に言うとこんな特徴があります

  • Javaの本家Oracleが開発している。
  • JavaVMとしてJavaのプログラムが動く。
  • JavaVM上で他のプログラミング言語(Javascript,Python,Ruby等)のAPIを呼び出すことができる。(Polyglot)
     ⇒JavaのソースコードからJavascriptのAPIを呼び出したりできます。
  • OSのネイティブイメージを事前コンパイル(Ahead-Of-Time Compilation)で作成できる。(Native Image)
     ⇒WindowsであればEXEファイルが作成できます。 それぞれの機能については、こちらを参照してください。

GraalVMは他のVMに比べ、速い?遅い?といろいろな記事があるので、果たしてどちらなのかと思い試してみました。

いざ試す

今回は自分のPCに入っていたAdopt OpenJDK 11とGraalVM CE Hotspot Modeとネイティブイメージの3種類でファイル読み/書きに対し比較を行ってみたいと思います。

やること

  • 10KBのファイルの読み/書きをします。(読み/書きにはFiles.readAllLines()とFiles.write()を使用しています。結構便利)
  • 読み/書きの回数は1、10、100、1000、2000、5000、10000回で行います。
  • ファイルを読んで、別のファイル名で書き込むというのを指定回数繰り返します。
  • 上記をそれぞれ5回ずつ試行します。
  • 使用する10KBのファイルはただ文字の羅列でもよかったのですが、なんとなくGPT-2という文章生成AIで生成してみました。ここにあるデータを使用しています。インプットとなる文章をGPT-2の入力とすると、それに続く文章を自動で生成してくれます。高精度のテキストが簡単に自動生成できるので危険だといわれたようです。現在最新版はGPT-3なのですが、GPT-2はDockerfileが公開されていて環境構築がやりやすそうだったので、今回はGPT-2にしました。 *「横浜のラーメンは」をインプットにしたら、こんな文章ができました。意味わからないですね・・・。

、せんべい、ヨーグルト、ライスなどの屋号を託されている。中でもプレミアムラーメンの組合せは、プレミアムラーメン若しくはプレミアム食べ放題で利用できるものの、ラーメンをラーメン(受取できるレジデント)に出してから数分のところまでこぼしてしまうこと、(ただし)競馬限定での組み合わせにて締める効果が蓄積されているためという痛恨の段階から、緊急施設に多いプレミアムラーメンは、現在はスープが入っている時点で次第にボリュームが落ち着いてきた。現在でも多くのプレミアムラーメンに対して、以前は指定されたテーブルでの料理それぞれほぼ絡み合っていた。しかし、進化論に拘らない関東周辺でブレイク寸前まで伸びていた農

全て自社の成人式を挙げられています。成人の料理人が演じられることは、自分達で接し、その料理人による相手から即招集することの他に、家族とカップルの関係性を捉えて、やりたいことや文化を理解することが大事です。 「初めての家族」の演出に降りてきたきっかけは、2014年の本格的なガンマン・レッサ―から怒られることの多い八百屋の関係で、治療や介護に向き合い、新しい家政婦ができることが大切だと考えています。 様々な家族のことを理解するの、様々ではありますが、いずれ夢中でありそう。 年末になると、演出の中には 「全員自ずと真面目に遊べること」 「人こそもっと頑強に精力的にこじれる

、その内の肉も作っていますがラーメンを、いたって格別に美味しいと話しかけて来ましたよ写真になるまで、顔の関係が掴めなかったけど、こういった話ではラーメンファンの方々のお店がグッドを全うまで、ラーメン大盛らしくて、通常は最後までごはんを食べた後に、ケチャップをとる等に、ごはんと一緒に食べた頃は激しいことも、なくなりましたねそして、こういったラーメンはインスタで、大抵のよくある質問は、各コーナーから検索したりするのが通常ですが(メールのラーメンののこりのように、私がいじめ禁止になったのと同じ)、次の画像は、今だとスクリーンショットと思われるので、インスタにて、これを画像拝見してみてくださいインスタ忘れですが、今年は、・・・(以下略)

実行環境

  • 対象VM、実行ファイル
    • AdoptOpenJDK11
    • GraalVM CE 20.2.0(JDK11) Hotspot Mode
    • ネイティブイメージ(GraalVMのネイティブイメージプラグインを使用して作成します)
  • 実行マシンスペック
    • 機種:Lenovo Thinkpad X390
    • OS:Windows 10 Pro
    • CPU:インテル Core i7-8565U プロセッサー (1.80GHz)
    • メモリ:16GB

実行結果

実行した結果は下記のとおりです。

  • 「R/Wの回数/実行タイプ」の列は試行回数です。
  • 他の列は実行時間[ms]を表します。
    f:id:hamo2020:20200831140850p:plain
    実行結果(表)

上記表をグラフにすると、次のようになります。

f:id:hamo2020:20200831140931p:plain
実行結果(グラフ)

この実行結果を見ると、全体的にはそれほど大きなさは見られないですね。5000回まではネイティブイメージが早いですが、1万回になると今度はAdopt OpenJDK11が早かったりします。 使用するファイルサイズのバリエーションを増やしたり、試行回数を増やしたりすればもう少しいろいろ分かったかもしれませんが、今回はここまでです。

終わりに

今回試したのは10KBのファイルを読み込んで書き出すだけだったので、単純にこれだけでJavaVMの良し悪しが分かるわけではないと思いますが、個人的には今回の結果は今後の開発に生かせると思っています。

f:id:hamo2020:20200830084302p:plain