Playframework2でコンパイル速度を向上させるには?

あっ気づいたら、play2のScalaアドベントカレンダー途切れてる・・・。
さて、play_jaのメーリングリストに「コンパイル速度遅いのでどうにかしたい」というような投稿があったので、せっかくなのでメーリングリストに直接返信するのではなく、blogに書いて、アドベントカレンダーのネタにしてしまいましょう。というわけで、これは
Play framework 2.x Scala Advent Calendar 2013
の24日目です。


自分が思いつく限り、いくつか案を挙げてみます


  1. 経験上、コンパイル速度に直結するのはメモリ量よりCPUの性能です。もし数年前のPCならば、買い換えるだけでわかりやすくコンパイル速度は向上すると思います。
  2. メモリをある程度大量に積んでいても、play開発用のsbtの起動時のJVMのパラメータが調整されてないと、メモリを十分に使い切れてない可能性があります。実際に使われてるCPUやメモリ使用量を計測しつつ、JVMのパラメータの調整をしてみましょう。
  3. Scalaコンパイル(含むScalaテンプレート)が遅いので、Scalaテンプレート使うのやめて違うもの使えばコンパイル速くなるでしょう。質問した人はPlay2をJavaでやっているらしいので、その場合ScalaテンプレートをやめればほとんどScalaコードがなくなって、わりとわかりやすく速度向上の可能性はありえます。もちろん色々とトレードオフ(他のものを設定するのが面倒、Scalaテンプレートの型安全性などが失われる)がありますが・・・。
  4. どのくらい効果があるか未知数ですが、sbtの差分コンパイルの性能は少しずつ向上しているはずなので、play2.0.x(つまりsbt0.11系)やplay2.1.x(sbt0.12系)の古いものを使っているのであれば、play2.2.x(sbt0.13系)に上げると差分コンパイル時の速度が少しは向上するかもしれません。*1
  5. 可能なら、sbtのマルチプロジェクトの機能を使って、プロジェクト自体を分割してみるといいかもしれません。すべてのコードが同じプロジェクトにあると、最悪すべてのファイルが毎回再コンパイルされますが、プロジェクトを分けておいた場合、*2コンパイルされるファイルが少なくなる場合があります。これも、作業量に見合っただけの効果が得られるかどうかは微妙です。ただ、プロジェクト分けることにより、疎結合になるという副次的な利点はあります。(が、sbtのマルチプロジェクトに慣れていないと、逆に面倒が増えるだけという結果にもなる)

ここに書いた以外で、みなさんも何か思いついたらメーリングリストに返信とかしてみましょう。ところで、3番目以外はPlay2関係なく一般的なScalaのプロジェクトにも言えることなので参考にして下さい。以上、24日目でした。




追記:
コンパイル速度、ではないですがtakezoenさんが以下のような発言してました

そういえば、play2-fastassetsとかも作ってましたね
play2-fastassetsでPlay2の開発モードを高速化する
まず最新のplay2.2.x系でもこのアプローチが有効なのか検証が必要ですが、このあたりも考慮してみるといいかもしれません。ただ、これ書いている現在play2-fastassetsは最新のplay2に対応していないみたいなので、そこからはじめる必要がありそうです。

*1:playのversionを上げずにsbtのメジャーversionをあげるのは不可能なので、一緒にplayのversionも上げましょう。play2.1.xをsbt0.13.xで動かそうとしても、エラーになるはずです

*2:依存関係が上位の方のみを変更した場合は