2021年の最新技術を使った場合のScalaのコンパイル速度

ここでいう最新技術とは以下です。

  • JDK8や11よりも、17の方が速い?
  • M1 Macが速い?(2021年最新のM1 Maxではなく、2020のMacbook Pro 13インチのM1です・・・。M1 Max欲しい!!! => 最後に追記したぞ)
  • Scala 2より3の方が速い?

自分の最近の経験上、それらが速いはず?なので。

上記は、全部場合による(projectによる)かもしれないし、あまり変わらないパターンも含まれているかもしれませんが、とりあえず一部(Scala 2自体のcompile)を除いて、上記の条件でコンパイル速度を計測してみたら、 数年前の感覚と比較して結構速い感じがあったので、それの計測結果の共有です。

個々の条件をもっと細かく変えるのは、組合せ爆発して辛いので、誰か気になった人はやってみてください。 何年も前と比べるとsbtでの依存解決もだいぶはやくなったし、ビルド速度面での未来は割と明るい感じがあるので、良いですね。

もちろん、JDK17やScala 3は、まだ2021年時点だと、未対応ライブラリなどの制約で使えないパターンも多々あるかもしれませんが、時間が経てば普通に使われるようになるだろうし、 M1 Macは金で殴れば誰でもすぐ使えるはずなので、このくらい速ければ、だいぶ希望が持てますね。

Scalaってまだコンパイル遅いの?」って言われたら、このblog見せてあげてください。

以前書いた関連blogも貼っておきます

xuwei-k.hatenablog.com

結論

5種類計測しました。 先に大まかな結論書いておきます。詳細な条件や結果は後半に書いておきます

  • scalaz-coreのjvm最新: 約42893行 9.1秒
  • cats-coreのjvm最新: 約32362行 7.1秒
  • Scala 2.13最新のcompiler自身: 約107113行 15.0秒
  • Scala 2.13最新のlibrary: 約90959行 9.0秒
  • Scala 3最新のcompiler: 約158859行 15.0秒

Scala 3の場合、JVMが温まっていれば、大体1万行あたり1〜2秒、となる。

約、というのは、Javaコードや、jvm,jsのplatform毎のコードや、version毎のコード、自動生成されるコードを数え忘れてる(というかサボってる)パターンがあるので、もう少し増える可能性があるけれど、上記に書いたより少なくはないはずです。

計測条件や方法と、個々の詳細な結果

計測したtree(blog書いてる2021-11-12時点の最新のはず)

使ったJDK

$ java --version
openjdk 17.0.1 2021-10-19
OpenJDK Runtime Environment Temurin-17.0.1+12 (build 17.0.1+12)
OpenJDK 64-Bit Server VM Temurin-17.0.1+12 (build 17.0.1+12, mixed mode)

いくつかtweetしたが、M1 MacでnativeではないJDKを使うと、2倍前後遅い?ので注意しましょう。

https://twitter.com/xuwei_k/status/1454020380859846656

Scalaのversionは

  • scalazとcatsは3.1.1-RC1
  • Scala 2.13のlibraryとcompilerは特に変えてない、bootstrapはしていないので2.13.7か?
  • Scala 3のcompilerも特に指定していないので、3.1.1-RC1か何か?(詳細調べてない)

それぞれ、以下のコマンドを実行後は、全部 ;clean;update;compile を20回繰り返して、 JVMの温まりを考慮して、前半10回を捨てて、後半10回の平均を取ったものが上記に書いたもの。

  • scalaz: "project coreJVM" '++ 3.1.1-RC1!'
  • cats: "project coreJVM" '++ 3.1.1-RC1!'
  • Scala 2.13 compiler: "project compiler"
  • Scala 2.13 library: "project library"
  • Scala 3 compiler: "project scala3-compiler"

何度かこういう計測のblogを書いていて、いつものことだが、updateとcleanの時間を除いてcompile終了時にsbtが

[success] Total time: 7 s, completed 2021/11/12 12:08:13

という感じの表示をするので、そこの数字を半手動で集計。

ちなみに、2.13のcompilerの初回などが特に時間かかっているのは、依存しているlibraryなどの時間も含んでいるからです

gist.github.com

2021年12月追記:

1割なので、9秒が8秒になるとかそういう程度でした。