最初に結論
Scala 2.13.3
と 3.0.0-M2-bin-20201031-1ab76c1-NIGHTLY
をscalaz最新版でベンチマークしたところ、
Scala 2.13.3は平均約57秒、Scala 3の最新版は平均約31秒で
約45%短縮!!!
めでたいなぁ。 他の条件で計測した場合にどうなるのかわからないが、このままの速度を維持して欲しい。
以下詳細な条件や結果記載。
条件
- scalazの最新版masterで、JVM側のmain側のみ(つまりtest除く。除いたのは、test含めると、よりコード量に差が出てしまうなどの理由) (数時間前に7.4.0-M4リリースしたので、実質それ)
- ベンチマークのために.travis.ymlだけ改変 https://github.com/xuwei-k/scalaz/commit/5956af9d2b280ef05b42eac9241c9b1c49f4a9e8
- 自分がコンパイル速度のベンチマークする際には、常套手段になってきているが、sbtは起動させたまま
clean update compile
を何度も繰り返して、最初のJVM暖まり時間を除いて、中盤以後のcompile
部分の、sbtが表示した時間計測 - すべて45回実行して、最初の16回除いた29回で、平均や中央値などを比較
- Dottyは、最新版と、最新版安定版?というかNightlyではない0.27.0-RC1の両方やった(あと数日で? 3.0.0-M1出るらしいが、これ書いてる時点で出てない)
- Scala 2は2.13.3のみ(2.12.12もやればよかったが、scalaz最新は2.12サポート打ち切ってるので・・・scalaz 7.3 branchでやればよかったか・・・?と思いきや7.3は逆にDotty対応してない)
- 一部のみ、DottyでサポートされないforSomeなどの機能の都合などで、Scala 2とScala 3でソースコードが異なる部分があるが、全体の割合からしたら数%なので、それはそこまでコンパイル時間には影響ない、という想定
- https://github.com/scalaz/scalaz/tree/8a2f260d49b9e2e1c31b58aad3f65c86c1be003e/core/src/main/scala-2/scalaz
- https://github.com/scalaz/scalaz/tree/8a2f260d49b9e2e1c31b58aad3f65c86c1be003e/core/src/main/scala-3/scalaz
- UnapplyやForall関連だと、明らかにDottyのほうがソースコード少ないので、若干不公平だが、とはいえそれを考慮してもここまで差が出てるならたぶんヨシ! (?)
以下、特に記載がなければ、最初の遅い一定数16回分を除いて計算した値
Scala 2.13.3
- 最大
62
- 最小
54
- 平均
56.89
- 中央値
56
- 実行順の値(最初の遅いやつ含む)
157, 91, 75, 66, 66, 59, 65, 57, 58, 63, 57, 60, 55, 61, 55, 60, 56, 62, 55, 55, 59, 55, 60, 55, 60, 55, 59, 54, 61, 55, 54, 59, 54, 59, 54, 59, 54, 59, 54, 61, 55, 54, 60, 54, 59
- 実行時間の小さい順にソートしたもの
54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 56, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 61, 61, 62
Dotty 0.27.0-RC1
- 最大
43
- 最小
34
- 平均
37.68
- 中央値
39
- 実行順の値(最初の遅いやつ含む)
114, 68, 63, 49, 46, 39, 46, 39, 42, 39, 35, 36, 40, 35, 40, 35, 41, 35, 40, 36, 41, 36, 41, 35, 40, 39, 34, 35, 43, 37, 40, 35, 40, 35, 39, 36, 40, 34, 40, 36, 40, 37, 35, 34, 39
- 実行時間の小さい順にソートしたもの
List(34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 43
Scala 3.0.0-M2-bin-20201031-1ab76c1-NIGHTLY
- 最大
37
- 最小
30
- 平均
31.37
- 中央値
31
- 実行順の値(最初の遅いやつ含む)
96, 60, 61, 48, 43, 39, 35, 33, 33, 32, 38, 35, 30, 30, 31, 32, 31, 31, 32, 30, 36, 30, 30, 32, 30, 30, 30, 30, 31, 31, 33, 30, 30, 36, 30, 30, 31, 31, 37, 30, 32, 30, 30, 36, 30
- 実行時間の小さい順にソートしたもの
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 33, 36, 36, 36, 37