Javaで使えるテンプレートエンジンのパフォーマンス比較

どのテンプレートエンジンと付き合えばいいの?

Javaのテンプレートエンジンのパフォーマンス比較結果。
ローカルの開発環境(Windows)での結果です。

はじめに

前回記事 にも書いたのですが最近 Spring Boot 使っています。
既存アプリケーションの移行とかもあり、旧来の画面遷移するタイプのアプリケーションの構築他での利用です。
Webアプリケーションではテンプレートエンジンも利用しています。

テンプレートエンジンとしては Spring Boot のデファクトスタンダード的な Thymeleaf を利用しています。
が、実際にレンダリング/テストした感じ、「遅くない?」と思ったので、パフォーマンス比較をしてみる事にしました。

※SPA ( Single Page Application ) の開発が増えてきている現在では、テンプレートエンジンの重要性は下がってきている気もするが、( 特にエンタープライズ系では ) まだまだ非SPAの方が多いと思う。

※写真 : 写真素材ぱくたそ 無理矢理"茜さや"さん使ってみました

環境

テストを行った環境は以下です。

OS Windows 8.1
Java 1.8

手順

自前でパフォーマンステストを行う事も可能かと思われますが、先人がパフォーマンス計測のためのツールを作成してくれているので、これを利用しました。

何れも GitHub で公開されています。

二つ挙げてますが、それぞれ説明します。

template-engine-benchmarks

テンプレートエンジンのパフォーマンスを計測できます。Webサイトに組み込む形ではなく、純粋にテンプレートエンジンの変換速度を計測するタイプです。
Webのフロントエンドではなく、メールテンプレート等で ( キャッシュ無しで ) 利用した場合のパフォーマンスに近いと言えるでしょう。

  1. GitHub からクローン
    >  https://github.com/greenlaw110/template-engine-benchmarks
    
  2. プロジェクトのビルド/実行
    Apache Ant でビルド/実行します。デフォルトでは thymeleaf は実行されません。実行する場合は ant all とします。
    > ant
    

上記 ant コマンドでパフォーマンステストも併せて行われます。


spring-comparing-template-engines

実際にWebページとしてレンダリングします。パフォーマンステストの機能が組み込まれている訳ではなく、パフォーマンステストを行う場合別途 ab コマンド等を利用します。

  1. GitHub からクローン
    >  https://github.com/jreijn/spring-comparing-template-engines
    
  2. プロジェクトのビルド/実行
    Apache Maven でビルドします。パフォーマンステストも併せて実行されます。
    > mvn package
    
  3. Tomcat7を利用して実行します。
    > mvn tomcat7:run
    
  4. テンプレートエンジン毎にURLが割り当てられているため、これらURLに対して ab コマンドなどでパフォーマンステストを行う事になります。
    • http://localhost:8080/jsp
    • http://localhost:8080/freemarker
    • http://localhost:8080/velocity
    • http://localhost:8080/thymeleaf
    • http://localhost:8080/jade
    • http://localhost:8080/scalate
    • http://localhost:8080/mustache
    • http://localhost:8080/pebble
    • http://localhost:8080/handlebars
    • http://localhost:8080/jtwig
  5. ab コマンドを利用する場合、以下のようにします。
    > ab -n 25000 -c 25 -k http://localhost:8080/jsp
    

※ ab コマンドは httpd-tools パッケージに含まれています。Windowsの場合 cygwin 等でインストール可能です。
Apache JMeter あたりを利用してパフォーマンス計測してもよいでしょう。

結果

ローカル環境でテストした結果を示します。
※複数回のテストを廻しているわけではないので参考値としてどうぞ。

template-engine-benchmarks

10000 回ループの実行時間を示します。

テンプレートエンジン時間(msec)
stringbuilder715
freemarker2387
velocity1444
beetl1242
rythm1270
jamon1568
httl808
jmte2812
jangod11421
thymeleaf15085
mustache1259
handlebars2382

thymeleaf 遅っ!

spring-comparing-template-engines

ab -n 10000 -c 25 -k http://localhost:8080/engine-name で取得した結果です。

テンプレートエンジン時間(msec)
jsp12254
freemarker12914
velocity12011
thymeleaf14642
jade9984
scalate 15287
mustache12656
pebble11930
handlebars14136
jtwig14177

実際のWebページのパフォーマンスに近いのはこちらかと思います。
テンプレートエンジン以外の処理時間が含まれるため純粋なテンプレートエンジンのパフォーマンス比較とは言えないと思いますが、参考まで。

上のテストに比べて thymeleaf の処理がそれほど遅くないのは、こちらのテストではキャッシュが利用されているからです。

まとめ,

調べるきっかけになった Thymeleaf ですが、重いのは間違いないかと思います。
開発環境の場合にはキャッシュをオフにして動作させているため、この場合遅いと感じるのも仕方がない事かもしれません。

Thymeleaf は HTML5 の構文チェックを行う機能等もついているため、キャッシュを利用しない場合に重いのはある意味仕方がないのではないかと思います。

機能的には今のところ不満はないですし、キャッシュをONにすればパフォーマンス面でもそこそこといった事から、今後も普通に利用する事になりそうです。

 

運用時にはキャッシュをONにするのを忘れずに。