FreeMarker、Thymeleaf、Enjoy模板引擎性能测试
前⾔
模板引擎,⼀直以来,个⼈都⽐较喜欢velocity,只是这货差不多7年没有更新,虽然前⼏天抽风似的发布了个2.0版本,但7年的脚步已经落后了。
后来看到Thymeleaf挺不错,个⼈项⽬中也有在使⽤,这不在osc看到⼀篇⽂章: 和Thymeleaf开撕上了,最⼤的糟点应该是性能问题,看来有必要⾃⼰做个性能测试来验证下,毕竟下⼀步还打算在公司正式项⽬中使⽤Thymeleaf呢。
声明
本测试仅针对本⼈个⼈使⽤情况,其使⽤场景、⼯具、硬件等均有可能对测试结果造成影响。
测试结果只是对本次测试做的⼀个记录,仅供参考,并不能说明引擎本⾝的好坏。
在对测试结果总结及模板引擎的选择上,难免会有个⼈的想法及主观意识,这只是个⼈选择喜好并不代表对引擎好坏的评判,请勿对号⼊座。
候选模板引擎
项⽬中以使⽤Spring Boot为主,所以测试的模板引擎⾃然要与其⽅便整合使⽤为上。
⾸先当然是官⽅提供默认集成的模板引擎了,在使⽤Spring Initializr⼯具创建Spring Boot项⽬时,发现新版本的Spring Boot已经不推荐使⽤velocity了(其实从spring 4.3开始就不推荐使⽤了),见下图:
这样⼀来官⽅提供默认集成的就只剩下FreeMarker和Thymeleaf了,听说Thymeleaf从3.0开始性能已⼤幅提⾼和FreeMarker相当了,刚好趁这次可以实际对⽐下。
javax.servlet.ServletException: Circular view path [index]: would
dispatch back to the current handler URL [/index] again. Check your
ViewResolver setup! (Hint: This may be the result of an unspecified
view, due to default view name generation.)
所以到最后测试的模板引擎只有FreeMarker、Thymeleaf、Enjoy这三个了,其它的就不考虑了,毕竟项⽬中要使⽤测了才有意义。
测试流程
因为使⽤Spring Boot,所以都是Spring Boot项⽬。
Thymeleaf号称使⽤SpringEL⽐使⽤ognl更快,这样对他也算公平。只是Spring Boot到现在默认集成的都是Thymeleaf 2.x版本,将版本号改成3.x版本之后不知道是否有影响。
配置⽂件中缓存配置统⼀设置为true,因为在Spring Boot中不使⽤DevTool的情况下Thymeleaf默认就是true开启缓存的,⽽FreeMarker默认是false不开启缓存的,当然Enjoy就没有这个配置了,在代码中把DevMode设置为false。
都使⽤Spring Boot的main⽅式启动项⽬,JVM参数统⼀设置为:-Xms512m -Xmx512m
为避免web容器的启停造成的内存波动,重启系统后打开所有项⽬并启动容器后再进⾏测试,三个项⽬使⽤三个不同的端⼝。这⾥不计算项⽬启动本⾝内存的占⽤。
启动项⽬后浏览器先进⾏⼀次访问,让项⽬完成第⼀次的编译加载。
测试⼯具
上⾯的⽂章提到使⽤了。
这⾥就换⼀个⼯具测测,使⽤来测试web项⽬的实际吞吐量。
测试代码
这⾥列出主要代码,下⾯附有各个项⽬的下载地址,可下载后查看其它配置项。Controller代码,渲染100条列表记录:
@Controller
public class TestController {
private List<User>users= new ArrayList<>();
public TestController(){
for(int i = 0; i < 100; i++){
User user = new User();
user.setUserId(Long.valueOf(i));
user.setUsername("username-" + i);
user.setPassword("123456-" + i);
user.setEmail(i + "-user@imesne");
user.setMobile("136********");
users.add(user);
}
}
@RequestMapping("index")
public String index(ModelMap modelMap){
modelMap.put("users", users);
return"index";
}
}
FreeMarker代码:
<#list users as item>
<tr>
<td>${item.userId}</td>
<td>${item.username}</td>
<td>${item.password}</td>
<td>${ail}</td>
<td>${bile}</td>
</tr>
</#list>
Thymeleaf代码:
<tr th:each="item : ${users}">
<td th:text="${item.userId}"></td>
<td th:text="${item.username}"></td>
<td th:text="${item.password}"></td>
<td th:text="${ail}"></td>
<td th:text="${bile}"></td>
</tr>
Enjoy代码:
#for(item : users)
<tr>
<td>#(item.userId)</td>
<td>#(item.username)</td>
<td>#(item.password)</td>
<td>#(ail)</td>
<td>#(bile)</td>
</tr>
#end
测试结果thymeleaf用法
总共三轮,下⾯是结果,可以参考看看。
第⼀轮,从上到下依次为FreeMarker、Thymeleaf、Enjoy:
第⼆轮:
第三轮:
可以看到第⼀轮跟后⾯两轮性能相差很⼤,这是因为JVM本⾝会对内存缓存等进⾏优化,这是预料之中的。
但这对每个引擎都是公平的,横向对⽐来看,Enjoy最出⾊,Thymeleaf虽然号称3.0开始已与FreeMarker相当但实际情况还是相差很⼤。打的包⼤⼩
性能是很重要的⼀个⽅⾯,但打出来的包⼤⼩也不可忽视,这从某种⽅⾯来说也反应出项⽬的质量。
下⾯列出Spring Boot下各个引擎打出的包⼤⼩,⼤⼩单位显⽰是在mac下跟windows会有所不同:
FreeMarker:16.1M,单纯FreeMarker的jar没什么第三⽅依赖,⼤⼩在1.5M左右,能够接受。
Thymeleaf:20.7M,Thymeleaf会有groovy等依赖,对⼀个模板引擎来说应该是超⼤了。
Enjoy:14.6M,这个不⽤多说了,JFinal系列出品,简洁著称。
从上⾯可以看出,打出来的包⼤⼩区别还是⽐较⼤的,Enjoy⾮常优秀,FreeMarker正常范围,Thymeleaf就有点夸张了。
Thymeleaf⽹上很多⽂章都宣称是轻量级模板引擎,可是看着它打出的包实在感觉轻量不起来。
官⽅推荐的模板引擎?
为什么要扯这个?因为这多少会对模板引擎的选择产⽣⼀些主观的意向,⾄少我之前有。
⽹上⼀直在传Thymeleaf是Spring Boot官⽅推荐的模板引擎,之前我也⼀直被此误导。
在此次测试之后我特地到spring的官⽅⽹站查了下,实在是没到任何推荐的话语,只是列出了⼏个提供快速集成的引擎选
择,Thymeleaf是其中之⼀。所以这应该只是⼩道消息。
如果⼀定要说Spring Boot的官⽅推荐,那么我在查看Spring的源代码时,发现不推荐使⽤的VelocityViewResolver类上有以下注释:@deprecated as of Spring 4.3, in favor of FreeMarker
官⽅在注释中推荐使⽤的是FreeMarker!
选择
从上⾯的测试可以看出,在不考虑模板引擎特有功能的情况下,Enjoy都是完胜。但是在选择时还是要综合考虑其它元素。
在之前我使⽤Thymeleaf⽐较多,在我的Spring Security系列⽂章中也可以看出来,以后应该会使⽤FreeMarker居多,主要原因有三点:
性能能够接受。虽然不是最出⾊,但也不会拖后腿,历经这么多年的考验⾜以说明问题。
Spring Boot官⽅提供默认集成。在⼀个保守的传统⾦融⾏业公司中,是⼀条重量级的说服理由。
IDE⽀持。特别是在团队中,idea对FreeMarker的⽀持堪称完美,提供了各种⽅便。
但是在⼀些个⼈项⽬及⼯具中应该会使⽤Enjoy,例如代码⽣成⼯具Enjoy就是最佳选择。
项⽬代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。