读书人

几款模板发动机的性能对比

发布时间: 2012-11-19 10:18:51 作者: rapoo

几款模板引擎的性能对比
原作者,allskystar


参评的几款模板引擎为:
XMLTemplate(简称XT)Velocity(简称VT)CommonTemplate(简称CT)FreeMarker(简称FT)Smarty4j(简称ST)直接的java代码


性能评测考虑以下几个方面:变量输出/循环/分支,这三大类调用构成了普通模板80%以上的功能。
测试方法为双层循环,输出的中间体是一个空的不执行任何操作的Writer类,
尽可能的减少模板外的性能影响因素,基本的逻辑伪代码描述如下:



VT:asciitable.vm

考虑到比较的问题,也可以对整个循环进行优化
    for (String row : data) {      char cRow = row.charAt(0);      writer.write("\t<tr>\n<th>");      writer.write(row);      writer.write("</th>\n");      for (String cell : data) {        char cCell = cell.charAt(0);        writer.write("\t\t<td>");        if ((cRow == '4' && cCell != '0') || (cRow == '5' && cCell < 'B')) {          writer.write("&#x");          writer.write(row);          writer.write(cell);        } else {          writer.write(" ");        }        writer.write("</td>\n");      }      writer.write("\t</tr>\n");    }

在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:

=============runing time===============
引用xt:3498
vt:2422
ct:153280
ft:7124
st:1142
CODE:1027(优化后940)

结论:
ST在三种常见的模板操作中的表现均极其优秀,除了条件处理效率略低于直接书写的JAVA代码,其它情况下与直接书写JAVA代码效率完全一致,而且在三种操作中,总的执行开销差异非常小。
XT在分支的处理中考虑与JS兼容带来了额外开销,但总体性能仍然占优,只是如果需要过多的XML转义可能影响阅读
FT在分支测试中表现差的原因应该是写法不是最优的,总体来说,性能与VT不相上下
CT的表现最差,在各项操作中均比其它的引擎慢了1-2个数量级

有关的测试代码可以在http://templatetest.googlecode.com/svn/trunk/获得
20 楼 xuyao 2008-12-15 sdh5724 写道xuyao 写道很好,nnd,刚在velocity上大规模并发测试上碰到性能问题,marge方法效率低,正好换st试试。


不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。
股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。 21 楼 jindw 2008-12-15 JSON.org那几个java库可是很糟糕的,你可以试试这个:
http://code.google.com/p/lite/wiki/JSEL

我在新版本中增加了专门的json解析和系列化支持,速度比官方版本要快不少。
22 楼 biubiu 2008-12-16 xuyao 写道sdh5724 写道xuyao 写道很好,nnd,刚在velocity上大规模并发测试上碰到性能问题,marge方法效率低,正好换st试试。


不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。
股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。

1. 可能的话用StringBuilder替换StringBuffer
2. 使用Java 6 23 楼 ray_linn 2008-12-16 st ... 一个连doc都没有的项目就算了 24 楼 allskystar 2008-12-16 spyker 写道allskystar 写道smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译
能麻烦解释下 什么叫编译缓存 和 执行缓存么
对这个理解很模糊
谢谢了


你按JSP来理解好了,hehe 25 楼 allskystar 2008-12-16 ray_linn 写道st ... 一个连doc都没有的项目就算了

smarty4j不需要写手册,网上的smarty manual很完整了
随便在baidu或者google上搜索一下"smarty manual 中文",很多
smarty4j的源代码直接导出javadoc的话,文档也很详细的,
里面有每一个功能的用法、扩展的说明以及调用的示例
26 楼 allskystar 2008-12-16 spyker 写道allskystar 写道spyker 写道allskystar 写道smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译
能麻烦解释下 什么叫编译缓存 和 执行缓存么
对这个理解很模糊
谢谢了


你按JSP来理解好了,hehe

编译缓存 在代码编译的时候 进行模板缓存
执行缓存 在代码调用的时候 进行模板缓存
对否?


一个是把编译形成的结果缓存,下次就不需要再次编译,典型的代表是jsp
一个是把执行的结果缓存,一定时间内就不需要再次执行,典型的代表是一些框架集成了oscache缓存的页面
第二种,会比第一种快很多倍,只是实时性就不能保证的 27 楼 allskystar 2008-12-16 spyker 写道allskystar 写道
一个是把编译形成的结果缓存,下次就不需要再次编译,典型的代表是jsp
一个是把执行的结果缓存,一定时间内就不需要再次执行,典型的代表是一些框架集成了oscache缓存的页面
第二种,会比第一种快很多倍,只是实时性就不能保证的

这里执行的结果缓存 是模板填充数据后 对执行结果的缓存么
还是 什么?

对缓存这块不是很了解
麻烦赐教


是你这个理解,不过一般的模板引擎都不会缓存执行结果,但是很多前端框架会缓存,
因为很多应用,比较博客等,更新的次数是远远少于阅读次数的,而且实时性也要求不高
就算慢个几分钟一般也没什么,多数用的是缓存执行结果的方式来加快速度 28 楼 allskystar 2008-12-16 spyker 写道allskystar 写道smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译


是不是说 其他几个模板是执行缓存呢? 还是其他

sorry,没说清楚,我这么说主要是针对前面一个人说smarty在php上是做执行缓存,
才回答的,应该说,一般的模板都是做的编译缓存
smarty4j是生成字节码执行的,所以才有编译优化的可能,
现在的编译优化主要体现在条件短路算法和变量外提算法 29 楼 jindw 2008-12-17 ray_linn 写道st ... 一个连doc都没有的项目就算了
可不要瞎说,st可是allskystar大牛的大作。

不熟悉smarty语法,不赶妄评,但是从效率上说,st可是绝对的王者。 30 楼 可乐熊 2008-12-17 确实,其实在现实系统中模板并不会成为性能瓶颈,主要还是看功能,具体到具体项目,有时它的一个简单附加能节省很多代码、或者让结构特别清晰,这才是我最看重的。 31 楼 allskystar 2008-12-17 可乐熊 写道确实,其实在现实系统中模板并不会成为性能瓶颈,主要还是看功能,具体到具体项目,有时它的一个简单附加能节省很多代码、或者让结构特别清晰,这才是我最看重的。

同一个数量级内性能不会成为问题,但差上1个数量级就不一定了,意味着同样的服务器配置,能支撑的最大负荷可能就增加了1-2倍 32 楼 bcw104 2008-12-17 jindw 写道ray_linn 写道st ... 一个连doc都没有的项目就算了
可不要瞎说,st可是allskystar大牛的大作。

不熟悉smarty语法,不赶妄评,但是从效率上说,st可是绝对的王者。
请问使用模板引擎除了速度能试提升以外还有别的好处吗?JAVA方面还没用过,php上道是用过smarty 33 楼 allskystar 2008-12-17 bcw104 写道jindw 写道ray_linn 写道st ... 一个连doc都没有的项目就算了
可不要瞎说,st可是allskystar大牛的大作。

不熟悉smarty语法,不赶妄评,但是从效率上说,st可是绝对的王者。
请问使用模板引擎除了速度能试提升以外还有别的好处吗?JAVA方面还没用过,php上道是用过smarty

用模板肯定比直接写代码要慢的,st只是性能相对来说最好而已
模板引擎主要还是为了改善阅读性吧,逻辑上把业务和显示分开

刚又测试了一下st在各个阶段的时间,发现就语法加载和识别来说,st比vt还快上1-2倍,比别的引擎快上1-2个数量级,但是加上翻译成机器字节码,st就比不上vt编译速度快了,要慢20-30%,除非重写asm包,否则编译速度很难有质的飞跃了。 34 楼 sdh5724 2008-12-20 xuyao 写道sdh5724 写道xuyao 写道很好,nnd,刚在velocity上大规模并发测试上碰到性能问题,marge方法效率低,正好换st试试。


不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。
股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。


, 如果你是需要极度的性能, 如果定义好输出格式了。 那么就这么一个要特别的PAGE, 我觉得, 你就因该使用特殊的办法, 毕竟, 通用的东西性能是有限制的。 比如,
1。 内存的分配上, 使用固定内存分配, 内存自己管理, 不要让JVM回收。 JAVA的内存会影响你输出性能。
2。 自己直接操作byte数组, 然后输出到servlet流里去。
毕竟这块东西可以被封装成API给PAGE使用。 你选择渲染工具, 本就是找抽的行为, 话是难听了点, 但是, 你真是为客户提供这么高性能的输出, 是非常需要的。 一切都自己手动控制高性能要求的地方。

我没有做过股票的东西, 不知道是不是每次请求的数据都会造成要渲染的问题, 如果不是的话, 你可以采取一些技巧,避免每次都要计算。采用部分数据输出, 然后客户端持有部分数据然后, 使用JS部分渲染图表。 最近看GOOGLE的做的很不错。FLASH做的很漂亮。 不过, 感觉图表数据不够丰富。




35 楼 allskystar 2008-12-23 其实也不必非要换模板,必竟在普通的Web应用中,要提高性能需要优化的地方太多,tomcat一分钟假如处理50000个连接,就算是最坏的测试结果里面,大部分模板之间50000次的处理速度也就差了个10s钟,这还是因为里面有循环和复杂的条件判断,只是简单的拼字符串的话,估计能差上1秒就是奇迹了.
高速的处理模板用于嵌入的字符串拼接可能更有用,例如拼接SQL字符串(用hibernate的不用考虑),或者做一些条件处理(例如把1转换为apple,2转换为banana等等,用模板修改起来比较自由) 36 楼 alexwan 2009-01-09 freemarker确实好用 37 楼 xo_knight 2009-01-15 我用的也是vm 38 楼 swit1983 2009-02-13 用模板和用JSP有什么不一样,功能一样效率不一样? 39 楼 hideto 2009-02-17 赤裸裸的广告贴啊

读书人网 >软件架构设计

热点推荐