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
- https://github.com/xuwei-k/scalaz/commit/e4c109b5d3d542f48c453772ee6075d2c757efce
- https://travis-ci.com/github/xuwei-k/scalaz/builds/166499997
実際の実行結果(実行順。単位は秒)
Graal有効にしてない状態
105 89 79 72 70 68 66 66 67
Graal有効にした状態
95 73 66 63 61 58 59 56 58
あくまでコンパイル時だけで、コンパイル後の実行時には別に普通にGraalでなくてもいいので、そういう意味では手軽に有効にして実用的にパフォーマンスの恩恵受けられていいかもしれません? おそらくコンパイルをGraalにしたところで、さすがにバグって違うclassファイルが出力される可能性はかなり低いと思うので。
今回scalazだけ、かつ特に他の条件は変えなかったですが、誰かもっと色々な条件で試してみてください。