ここでいう最新技術とは以下です。
- 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も貼っておきます
結論
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時点の最新のはず)
- https://github.com/typelevel/cats/tree/f3eb3041f36c667d84a411541cc464605f49da85
- https://github.com/scala/scala/tree/5697b87cf9aafd979533a92a92331874396b8584
- https://github.com/lampepfl/dotty/tree/e23f81570417f1ecc9a1fc55dd1511fa1ab7d44d
- https://github.com/scalaz/scalaz/tree/995fe23bec41bdd0b72c8e292a32309e7b25beed
使った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などの時間も含んでいるからです
2021年12月追記:
1割なので、9秒が8秒になるとかそういう程度でした。
https://t.co/sqH3bZ6RuY
— Kenji Yoshida (@xuwei_k) 2021年12月18日
M1 Maxが手に入ったので、以前書いたM1でベンチマークしたのと大体同じ方法でScalaのコンパイル速度計測を試しているけれど、せいぜい1割くらいしか速くならない、つらい。
値段2倍くらいするのに1割はコスパ悪いなぁ…メモリ32や64欲しいならM1 ProやM1 Max選ぶしかないけど