Freemarkerって遅いの?
なんか現行のシステムがString#formatでタグ作ってたから、テンプレートエンジン使うと遅いのかなって思って簡単な調査。
FreeMarkerTest
※ 上記コードは1000000回ループ。
10回ループ
| 試行回数 | Freemarker | String#format() |
|---|---|---|
| 1 | 90962000 (0) | 60003000 (0) |
| 2 | 98667000 (0) | 37471000 (0) |
| 3 | 92529000 (0) | 33368000 (0) |
| 4 | 106556000 (0) | 33661000 (0) |
| 5 | 89869000 (0) | 35237000 (0) |
| 平均 | 95716600 (0) | 39948000 (0) |
※ナノ秒(括弧内の数値はYoungGCの処理時間(秒))
10回のループだと平均で3倍弱速かった。
ただし、各Runner#run()の開始から終わりまでSystem.nanoTime()の差分を計ったら
| ループ回数 | Freemarker | String#format() |
|---|---|---|
| 1 | 95704000 | 35038000 |
| 2 | 315000 | 546000 |
| 3 | 269000 | 504000 |
| 4 | 280000 | 383000 |
| 5 | 272000 | 387000 |
| 6 | 262000 | 412000 |
| 7 | 248000 | 383000 |
| 8 | 302000 | 396000 |
| 9 | 265000 | 401000 |
| 10 | 246000 | 373000 |
だったので、ループ開始時の初回のみ大きく差が出ていてそれ以外は大きく差が出ていなかったので速度自体はそんなに変わらないっぽい。
1000000回
| 試行回数 | Freemarker | String#format() |
|---|---|---|
| 1 | 13621484000 (0.095908) | 14490797000 (0.112314) |
| 2 | 13510582000 (0.106299) | 13599284000 (0.103076) |
| 3 | 13726206000 (0.065058) | 13826649000 (0.106106) |
| 4 | 13704940000 (0.077895) | 13838695000 (0.091303) |
| 5 | 13746025000 (0.110715) | 13656157000 (0.090931) |
| 平均 | 13661847400 (0.091175) | 13882316400 (0.100746) |
※ナノ秒(括弧内の数値はYoungGCの処理時間(秒))
結果、そんなに変わらない。