twirlはコンパイルが遅い どれくらい遅いのか測りました


twirlというScalaのテンプレートエンジンがあるのですが、どうやらこれはコンパイルが遅いらしいです。どれくらい遅いのか測ってみました。

プラグインを入れて、以下のファイルを用意してコンパイルします。

@(name: String)
Hello @name!!

sbt clean compileで計測します。

テンプレファイル数コンパイル時間
07 sec
17 sec
58 sec
109 sec

こんな感じになりました。拡張子が.htmlでも時間はほとんど同じでした。

もう少し複雑なテンプレートも試しておきます。

@(pList: Seq[sample.Person])

[ USER LIST ]

@for(p <- pList){
-----------------------
  ID   : @p.id
  NAME : @p.name
  AGE  : @p.age.getOrElse("なし")
}

@for(p <- pList){
-----------------------
  ID   : @p.id
  NAME : @p.name
  AGE  : @p.age.getOrElse("なし")
}

@for(p <- pList){
-----------------------
  ID   : @p.id
  NAME : @p.name
  AGE  : @p.age.getOrElse("なし")
}

@for(p <- pList){
-----------------------
  ID   : @p.id
  NAME : @p.name
  AGE  : @p.age.getOrElse("なし")
}

@for(p <- pList){
-----------------------
  ID   : @p.id
  NAME : @p.name
  AGE  : @p.age.getOrElse("なし")
}

@for(p <- pList){
-----------------------
  ID   : @p.id
  NAME : @p.name
  AGE  : @p.age.getOrElse("なし")
}

@for(p <- pList){
-----------------------
  ID   : @p.id
  NAME : @p.name
  AGE  : @p.age.getOrElse("なし")
}

こんなにforを繰り返す必要はありませんが・・・実戦的なコードだとこれくらいには行数が増えてくるかと思います。

では試してみます。

テンプレファイル数コンパイル時間
07 sec
110 sec
514 sec
1016 sec

そこそこ大きいファイルが沢山あると遅いですね・・・

ちなみに今回はcleanしましたが、cleanしない場合は差分コンパイルになるので、テンプレートを1つも変えなければ速いです。手元で試した感じだと0 secでした。一部のみ変えると9 secとかでした。

結論

  • そこそこ大きいテンプレファイル10個で +16 sec (マシンによりますが)
  • テンプレを変えない場合はその分のコンパイルは走らない (毎回cleanしたら別ですが)

自分はサーバサイドエンジニアなのですが、半分くらいはフロントのエンジニアもやってます。その立場からすると差分コンパイルありとは言え、テンプレ1個変えてコンパイル+9秒とかかかると厳しい感じありますね。・・・というかフロントとか関係なく、ちょっと修正して+9秒はScalaコンパイルをさらに遅くして微妙ですね。

みなさんも選択は慎重に・・・!ちなみに自分はメール本文のテンプレートとしてのみ利用しています。