つかびーの技術日記

(情報)工学修士, 元SIer SE, 現Web系 SEの技術blogです。Scala, Java, JS, TS, Python, Ruby, AWS, GCPあたりが好きです。

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

      2015/03/22

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

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

@(name: String)
Hello @name!!

sbt clean compileで計測します。

テンプレファイル数 コンパイル時間
0 7 sec
1 7 sec
5 8 sec
10 9 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を繰り返す必要はありませんが・・・実戦的なコードだとこれくらいには行数が増えてくるかと思います。

では試してみます。

テンプレファイル数 コンパイル時間
0 7 sec
1 10 sec
5 14 sec
10 16 sec

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

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

結論

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

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

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

 - Scala, ライブラリ