Scala2.12とsbtのインクリメンタルコンパイルとコンパイル速度

標題の件について簡単に実験をして、それにともなう(コンパイル速度改善可能性の)予想をたてたので、それを書いていく。



実験内容


1. Scalazの7.3系の現時点での最新のtree https://github.com/scalaz/scalaz/tree/6602b0aa0 で、まず2.11.8と2.12.0-M5でそれぞれcoreのjvmのモジュールをコンパイル*1
2. scalaz.Functorのtraitに def foo = 1 みたいな適当なメソッドを足す
3. sbt cleanせずに、キャッシュをきかしたままで再びコンパイルし、sbtがどういう挙動になるか観察



結果


https://gist.github.com/xuwei-k/d0d918b433189d1f11a99b39dbd7c495

出力される.classファイルが

  • Scala 2.11.8では307ファイルも差分が出る
  • Scala 2.12.0-M5では19ファイルしか差分が出ない
  • しかし、2.11.8でも2.12.0-M5でも、両方以下のようなログがでて、全部のファイルが再コンパイルされてそう
[info] Compiling 2 Scala sources to /Users/hoge/scalaz/scalaz/core/jvm/target/scala-2.12.0-M5/classes...
[info] Compiling 264 Scala sources to /Users/hoge/scalaz/scalaz/core/jvm/target/scala-2.12.0-M5/classes...
勝手な予想と願望


Scala2.12の場合に、traitのエンコードがJava8のデフォルトメソッド使うように変わるなどしたことをうけて、再コンパイルされるファイルがかなり少なくなることをsbtが最大限いかせば、全てを再コンパイルするパターンがかなり減って、コンパイル速くなる可能性がある?
が、現状ではsbtは全くそんなことをしてなさそう(かるく検索した限り、コレ書いてる2016-08-27現在関連issueすらまだ存在していなそう?追記したのでそれ参照)なので、
もしそういった可能性あるなら頑張ってください!!!



ちなみに、インクリメンタルコンパイル関係なく、単純な最初から全部コンパイルした場合の速度差を計測したんですが、以下のような微妙な結論しか出なかったので、また2.12.0-RC1かfinalが出る頃に気が向いたらやります




追記

よこたさんがコレ読んで、issue作ってくれていた

*1: つまり sbt の version は 0.13.12