JDK11でGraalを有効にするとScalaのコンパイルが13%くらい速くなった

Graalについて全然詳しくないので、Graal自体の説明はしません、というかできませんが、JDK10以降で

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

というオプションを付与すると有効にできるらしいですね。

というわけで、以下のような条件で計測した結果、結果からいうと13%くらい速く(コンパイル時間が短く)なりました。

  • scalazの現状の最新masterで計測 https://github.com/scalaz/scalaz/tree/9369d23137d29c1490ccb72a83c8f76dc873285a
  • 他の条件を基本的に同じにして、travis-ci上で適当に10回くらいclean update compileをsbtを起動したまま繰り返し実行して、sbtが表示したcompileの部分の時間計測
  • 他の条件が同じとは、たとえば、有効にしてない方もJDK11
  • 最初のコンパイルだけ明らかに遅くなったので結果除いた
  • Scala 2.13.2
  • scala-js除いてjvmの方だけ
  • その他のオプションはscalazのCI上のビルドのデフォルトのまま -Xms3784m -Xmx3784m -XX:MaxMetaspaceSize=1g -Xss4m (もっと色々ここをチューニングしたら違う結果になる気はしますが・・・)

JDKのversion

openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

実際に試したコミットとjobのURL

実際の実行結果(実行順。単位は秒)

Graal有効にしてない状態

105
89
79
72
70
68
66
66
67

Graal有効にした状態

95
73
66
63
61
58
59
56
58

あくまでコンパイル時だけで、コンパイル後の実行時には別に普通にGraalでなくてもいいので、そういう意味では手軽に有効にして実用的にパフォーマンスの恩恵受けられていいかもしれません? おそらくコンパイルをGraalにしたところで、さすがにバグって違うclassファイルが出力される可能性はかなり低いと思うので。

今回scalazだけ、かつ特に他の条件は変えなかったですが、誰かもっと色々な条件で試してみてください。