- 浏览: 500901 次
- 性别:
- 来自: 初到北京
最新评论
-
javamonkey:
有点老了,有个Teb测试,这个性能测试很标准http://gi ...
几款模板引擎的性能对比 -
greenlaw110:
xuyao 写道sdh5724 写道xuyao 写道很好,nn ...
几款模板引擎的性能对比 -
sefier:
不知道你看的是哪个版本的,现在所看到的版本和你所描述的不一致, ...
Facebook XHP 调研 -
javatar:
我觉得从通用语言去思考可能更有意思,满足八封其实就是一个完备集 ...
五行通天地 八卦定乾坤--打算按照先天八卦的形制重构Lite模版引擎的指令集 -
luo2pei4321:
MVEL的官方例子里面好像只支持Integer和String两 ...
表达式引擎JSEL介绍
原作者,allskystar
参评的几款模板引擎为:
性能评测考虑以下几个方面:变量输出/循环/分支,这三大类调用构成了普通模板80%以上的功能。
测试方法为双层循环,输出的中间体是一个空的不执行任何操作的Writer类,
尽可能的减少模板外的性能影响因素,基本的逻辑伪代码描述如下:
第一步,测试循环输出ascii码表,各模板引擎文件为
XT:asciitable.xhtml
VT:asciitable.vm
CT:asciitable.ct
FT:asciitable.ftl
JAVA:asciitable.java
在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:
=============runing time===============
第二步,在最内层的循环中多输出一个对象,测试新增输出时的性能影响,最内层的那一行改造如下:
在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:
=============runing time===============
第三步,测试分支判断对整体性能的影响,在最内层的循环中输出前加一个分支控制,使它仅输出A-Z对应的ASCII码表,改造如下:
考虑到比较的问题,也可以对整个循环进行优化
在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:
=============runing time===============
结论:
ST在三种常见的模板操作中的表现均极其优秀,除了条件处理效率略低于直接书写的JAVA代码,其它情况下与直接书写JAVA代码效率完全一致,而且在三种操作中,总的执行开销差异非常小。
XT在分支的处理中考虑与JS兼容带来了额外开销,但总体性能仍然占优,只是如果需要过多的XML转义可能影响阅读
FT在分支测试中表现差的原因应该是写法不是最优的,总体来说,性能与VT不相上下
CT的表现最差,在各项操作中均比其它的引擎慢了1-2个数量级
有关的测试代码可以在http://templatetest.googlecode.com/svn/trunk/获得
不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。
股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。
楼主可以尝试一下rythm引擎,
产品特性(包括性能比较):http://rythmengine.org/doc/feature
线上体验:http://fiddle.rythmengine.org/
申明一下,这是给自己的产品打广告了。
不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。
股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。
, 如果你是需要极度的性能, 如果定义好输出格式了。 那么就这么一个要特别的PAGE, 我觉得, 你就因该使用特殊的办法, 毕竟, 通用的东西性能是有限制的。 比如,
1。 内存的分配上, 使用固定内存分配, 内存自己管理, 不要让JVM回收。 JAVA的内存会影响你输出性能。
2。 自己直接操作byte数组, 然后输出到servlet流里去。
毕竟这块东西可以被封装成API给PAGE使用。 你选择渲染工具, 本就是找抽的行为, 话是难听了点, 但是, 你真是为客户提供这么高性能的输出, 是非常需要的。 一切都自己手动控制高性能要求的地方。
我没有做过股票的东西, 不知道是不是每次请求的数据都会造成要渲染的问题, 如果不是的话, 你可以采取一些技巧,避免每次都要计算。采用部分数据输出, 然后客户端持有部分数据然后, 使用JS部分渲染图表。 最近看GOOGLE的做的很不错。FLASH做的很漂亮。 不过, 感觉图表数据不够丰富。
请问使用模板引擎除了速度能试提升以外还有别的好处吗?JAVA方面还没用过,php上道是用过smarty
用模板肯定比直接写代码要慢的,st只是性能相对来说最好而已
模板引擎主要还是为了改善阅读性吧,逻辑上把业务和显示分开
刚又测试了一下st在各个阶段的时间,发现就语法加载和识别来说,st比vt还快上1-2倍,比别的引擎快上1-2个数量级,但是加上翻译成机器字节码,st就比不上vt编译速度快了,要慢20-30%,除非重写asm包,否则编译速度很难有质的飞跃了。
请问使用模板引擎除了速度能试提升以外还有别的好处吗?JAVA方面还没用过,php上道是用过smarty
同一个数量级内性能不会成为问题,但差上1个数量级就不一定了,意味着同样的服务器配置,能支撑的最大负荷可能就增加了1-2倍
是不是说 其他几个模板是执行缓存呢? 还是其他
sorry,没说清楚,我这么说主要是针对前面一个人说smarty在php上是做执行缓存,
才回答的,应该说,一般的模板都是做的编译缓存
smarty4j是生成字节码执行的,所以才有编译优化的可能,
现在的编译优化主要体现在条件短路算法和变量外提算法
一个是把编译形成的结果缓存,下次就不需要再次编译,典型的代表是jsp
一个是把执行的结果缓存,一定时间内就不需要再次执行,典型的代表是一些框架集成了oscache缓存的页面
第二种,会比第一种快很多倍,只是实时性就不能保证的
这里执行的结果缓存 是模板填充数据后 对执行结果的缓存么
还是 什么?
对缓存这块不是很了解
麻烦赐教
是你这个理解,不过一般的模板引擎都不会缓存执行结果,但是很多前端框架会缓存,
因为很多应用,比较博客等,更新的次数是远远少于阅读次数的,而且实时性也要求不高
就算慢个几分钟一般也没什么,多数用的是缓存执行结果的方式来加快速度
能麻烦解释下 什么叫编译缓存 和 执行缓存么
对这个理解很模糊
谢谢了
你按JSP来理解好了,hehe
编译缓存 在代码编译的时候 进行模板缓存
执行缓存 在代码调用的时候 进行模板缓存
对否?
一个是把编译形成的结果缓存,下次就不需要再次编译,典型的代表是jsp
一个是把执行的结果缓存,一定时间内就不需要再次执行,典型的代表是一些框架集成了oscache缓存的页面
第二种,会比第一种快很多倍,只是实时性就不能保证的
smarty4j不需要写手册,网上的smarty manual很完整了
随便在baidu或者google上搜索一下"smarty manual 中文",很多
smarty4j的源代码直接导出javadoc的话,文档也很详细的,
里面有每一个功能的用法、扩展的说明以及调用的示例
能麻烦解释下 什么叫编译缓存 和 执行缓存么
对这个理解很模糊
谢谢了
你按JSP来理解好了,hehe
不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。
股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。
1. 可能的话用StringBuilder替换StringBuffer
2. 使用Java 6
参评的几款模板引擎为:
- XMLTemplate(简称XT)
- Velocity(简称VT)
- CommonTemplate(简称CT)
- FreeMarker(简称FT)
- Smarty4j(简称ST)
- 直接的java代码
性能评测考虑以下几个方面:变量输出/循环/分支,这三大类调用构成了普通模板80%以上的功能。
测试方法为双层循环,输出的中间体是一个空的不执行任何操作的Writer类,
尽可能的减少模板外的性能影响因素,基本的逻辑伪代码描述如下:
for (int i = 0; i < outerTime; i++) { for (int j = 0; j < innerTime; j++) { testXMLTemplate(); } for (int j = 0; j < innerTime; j++) { testVelocityTemplate(); } for (int j = 0; j < innerTime; j++) { testCommonTemplate(); } for (int j = 0; j < innerTime; j++) { testFreeMarker(); } for (int j = 0; j < innerTime; j++) { testSmarty4j(); } for (int j = 0; j < innerTime; j++) { testJavaCode(); } }
第一步,测试循环输出ascii码表,各模板引擎文件为
XT:asciitable.xhtml
<div xmlns:c="http://www.xidea.org/ns/template/core"> <h1>${name}</h1> <table border="${border}"> <tr> <th> </th> <c:for var="cell" items="${data}"> <th>${cell}</th> </c:for> </tr> <c:for var="row" items="${data}"> <tr> <th>${row}</th> <c:for var="cell" items="${data}"> <td><c:out value="&#x"/>${row}${cell};</td> </c:for> </tr> </c:for> </table> </div>
VT:asciitable.vm
<div> <h1>${name}</h1> <table border="${border}"> <tr> <th> </th> #foreach($cell in $data) <th>${cell}</th> #end </tr> #foreach($row in $data) <tr> <th>${row}</th> #foreach($cell in $data ) <td>&#x${row}${cell};</td> #end </tr> #end </table> </div>
CT:asciitable.ct
<div> <h1>${name}</h1> <table border="${border}"> <tr> <th> </th> $for{cell:data} <th>${cell}</th> $end </tr> $for{row:data} <tr> <th>${row}</th> $for{cell:data} <td>&#x${row}${cell};</td> $end </tr> $end </table> </div>
FT:asciitable.ftl
<div> <h1>${name}</h1> <table border="${border}"> <tr> <th> </th> <#list data as cell> <th>${cell}</th> </#list> </tr> <#list data as row> <tr> <th>${row}</th> <#list data as cell> <td>&#x${row}${cell};</td> </#list> </tr> </#list> </table> </div>
ST:asciitable.html <div> <h1>{$name}</h1> <table border="{$border}"> <tr> <th> </th> {section loop=$data name="cell"} <th>{$cell}</th> {/section} </tr> {section loop=$data name="row"} <tr> <th>{$row}</th> {section loop=$data name="cell"} <td>&#x{$row}{$cell};</td> {/section} </tr> {/section} </table> </div>
JAVA:asciitable.java
package org.jside.tt; import java.io.Writer; import java.util.List; import java.util.Map; public class asciitable implements ICode { @Override public void execute(Map<String, Object> context, Writer writer) throws Exception { List<String> data = (List<String>) context.get("data"); String name = (String) context.get("name"); String border = (String) context.get("border"); writer.write("<div>\n<h1>"); writer.write(name); writer.write("</h1>\n<table border=\""); writer.write(border); writer.write("\">\n\t<tr>\n\t\t<th> </th>\n"); for (String cell : data) { writer.write("\t\t<th>"); writer.write(cell); writer.write("</th>\n"); } writer.write("\t</tr>\n"); for (String row : data) { writer.write("\t<tr>\n<th>"); writer.write(row); writer.write("</th>\n"); for (String cell : data) { writer.write("\t\t<td>&#x"); writer.write(row); writer.write(cell); writer.write("</td>\n"); } writer.write("\t</tr>\n"); } writer.write("</table>\n</div>\n"); } }
在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:
=============runing time===============
引用
xt:2149
vt:3499
ct:72254
ft:2761
st:1235
CODE:1321
vt:3499
ct:72254
ft:2761
st:1235
CODE:1321
第二步,在最内层的循环中多输出一个对象,测试新增输出时的性能影响,最内层的那一行改造如下:
XT: <td>${name}:<c:out value="&#x"/>${row}${cell};</td> VT: <td>${name}:&#x${row}${cell};</td> CT: <td>${name}:&#x${row}${cell};</td> FT: <td>${name}:&#x${row}${cell};</td> ST: <td>{$name}:&#x{$row}{$cell};</td> JAVA: writer.write("\t\t<td>"); writer.write(name); writer.write(":&#x"); writer.write(row); writer.write(cell); writer.write("</td>\n");
在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:
=============runing time===============
引用
xt:3549
vt:4748
ct:103453
ft:4251
st:1750
CODE:1811
vt:4748
ct:103453
ft:4251
st:1750
CODE:1811
第三步,测试分支判断对整体性能的影响,在最内层的循环中输出前加一个分支控制,使它仅输出A-Z对应的ASCII码表,改造如下:
XT: <td><c:if test="${(row=='4' && cell!='0') || (row=='5' && cell<'B')}"><c:out value="&#x"/>${row}${cell};</c:if><c:else><c:out value="&"/>nbsp;</c:else></td> VT: <td>#if(($row=="4" && $cell!="0") || ($row=="5" && $cell!="B" && $cell!="C" && $cell!="D" && $cell!="E" && $cell!="F"))&#x${row}${cell};#else #end</td> CT: <td>$if{(row=="4" && cell!="0") || (row=="5" && cell<"B")}&#x${row}${cell};$else{} $end</td> FT: <td><#if (row?string=="4" && cell?string!="0") || (row?string=='5' && cell?string!='B' && cell?string!='C' && cell?string!='D' && cell?string!='E' && cell?string!='F')>&#x${row}${cell};<#else> </#if></td> ST: <td>{if ($row==='4' && $cell!=='0') || ($row==='5' && $cell<'B')}&#x{$row}{$cell};{else} {/if}</td> JAVA: writer.write("\t\t<td>"); if ((row.equals("4") && !cell.equals("0")) || (row.equals("5") && cell.compareTo("B") < 0)) { writer.write("&#x"); writer.write(row); writer.write(cell); } else { writer.write(" "); } writer.write("</td>\n");
考虑到比较的问题,也可以对整个循环进行优化
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)
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/获得
评论
41 楼
javamonkey
2014-09-03
有点老了,有个Teb测试,这个性能测试很标准
http://git.oschina.net/kiang/teb
http://git.oschina.net/kiang/teb
40 楼
greenlaw110
2013-04-11
xuyao 写道
sdh5724 写道
xuyao 写道
很好,nnd,刚在velocity上大规模并发测试上碰到性能问题,marge方法效率低,正好换st试试。
不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。
股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。
楼主可以尝试一下rythm引擎,
产品特性(包括性能比较):http://rythmengine.org/doc/feature
线上体验:http://fiddle.rythmengine.org/
申明一下,这是给自己的产品打广告了。
39 楼
hideto
2009-02-17
赤裸裸的广告贴啊
38 楼
swit1983
2009-02-13
用模板和用JSP有什么不一样,功能一样效率不一样?
37 楼
xo_knight
2009-01-15
我用的也是vm
36 楼
alexwan
2009-01-09
freemarker确实好用
35 楼
allskystar
2008-12-23
其实也不必非要换模板,必竟在普通的Web应用中,要提高性能需要优化的地方太多,tomcat一分钟假如处理50000个连接,就算是最坏的测试结果里面,大部分模板之间50000次的处理速度也就差了个10s钟,这还是因为里面有循环和复杂的条件判断,只是简单的拼字符串的话,估计能差上1秒就是奇迹了.
高速的处理模板用于嵌入的字符串拼接可能更有用,例如拼接SQL字符串(用hibernate的不用考虑),或者做一些条件处理(例如把1转换为apple,2转换为banana等等,用模板修改起来比较自由)
高速的处理模板用于嵌入的字符串拼接可能更有用,例如拼接SQL字符串(用hibernate的不用考虑),或者做一些条件处理(例如把1转换为apple,2转换为banana等等,用模板修改起来比较自由)
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做的很漂亮。 不过, 感觉图表数据不够丰富。
33 楼
allskystar
2008-12-17
bcw104 写道
jindw 写道
请问使用模板引擎除了速度能试提升以外还有别的好处吗?JAVA方面还没用过,php上道是用过smarty
用模板肯定比直接写代码要慢的,st只是性能相对来说最好而已
模板引擎主要还是为了改善阅读性吧,逻辑上把业务和显示分开
刚又测试了一下st在各个阶段的时间,发现就语法加载和识别来说,st比vt还快上1-2倍,比别的引擎快上1-2个数量级,但是加上翻译成机器字节码,st就比不上vt编译速度快了,要慢20-30%,除非重写asm包,否则编译速度很难有质的飞跃了。
32 楼
bcw104
2008-12-17
jindw 写道
请问使用模板引擎除了速度能试提升以外还有别的好处吗?JAVA方面还没用过,php上道是用过smarty
31 楼
allskystar
2008-12-17
可乐熊 写道
确实,其实在现实系统中模板并不会成为性能瓶颈,主要还是看功能,具体到具体项目,有时它的一个简单附加能节省很多代码、或者让结构特别清晰,这才是我最看重的。
同一个数量级内性能不会成为问题,但差上1个数量级就不一定了,意味着同样的服务器配置,能支撑的最大负荷可能就增加了1-2倍
30 楼
可乐熊
2008-12-17
确实,其实在现实系统中模板并不会成为性能瓶颈,主要还是看功能,具体到具体项目,有时它的一个简单附加能节省很多代码、或者让结构特别清晰,这才是我最看重的。
29 楼
jindw
2008-12-17
28 楼
allskystar
2008-12-16
spyker 写道
allskystar 写道
smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译
是不是说 其他几个模板是执行缓存呢? 还是其他
sorry,没说清楚,我这么说主要是针对前面一个人说smarty在php上是做执行缓存,
才回答的,应该说,一般的模板都是做的编译缓存
smarty4j是生成字节码执行的,所以才有编译优化的可能,
现在的编译优化主要体现在条件短路算法和变量外提算法
27 楼
allskystar
2008-12-16
spyker 写道
allskystar 写道
一个是把编译形成的结果缓存,下次就不需要再次编译,典型的代表是jsp
一个是把执行的结果缓存,一定时间内就不需要再次执行,典型的代表是一些框架集成了oscache缓存的页面
第二种,会比第一种快很多倍,只是实时性就不能保证的
这里执行的结果缓存 是模板填充数据后 对执行结果的缓存么
还是 什么?
对缓存这块不是很了解
麻烦赐教
是你这个理解,不过一般的模板引擎都不会缓存执行结果,但是很多前端框架会缓存,
因为很多应用,比较博客等,更新的次数是远远少于阅读次数的,而且实时性也要求不高
就算慢个几分钟一般也没什么,多数用的是缓存执行结果的方式来加快速度
26 楼
allskystar
2008-12-16
spyker 写道
allskystar 写道
spyker 写道
allskystar 写道
smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译
能麻烦解释下 什么叫编译缓存 和 执行缓存么
对这个理解很模糊
谢谢了
你按JSP来理解好了,hehe
编译缓存 在代码编译的时候 进行模板缓存
执行缓存 在代码调用的时候 进行模板缓存
对否?
一个是把编译形成的结果缓存,下次就不需要再次编译,典型的代表是jsp
一个是把执行的结果缓存,一定时间内就不需要再次执行,典型的代表是一些框架集成了oscache缓存的页面
第二种,会比第一种快很多倍,只是实时性就不能保证的
25 楼
allskystar
2008-12-16
ray_linn 写道
st ... 一个连doc都没有的项目就算了
smarty4j不需要写手册,网上的smarty manual很完整了
随便在baidu或者google上搜索一下"smarty manual 中文",很多
smarty4j的源代码直接导出javadoc的话,文档也很详细的,
里面有每一个功能的用法、扩展的说明以及调用的示例
24 楼
allskystar
2008-12-16
spyker 写道
allskystar 写道
smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译
能麻烦解释下 什么叫编译缓存 和 执行缓存么
对这个理解很模糊
谢谢了
你按JSP来理解好了,hehe
23 楼
ray_linn
2008-12-16
st ... 一个连doc都没有的项目就算了
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
发表评论
-
JSEL的JSON工具添加日期格式支持
2010-08-15 22:52 1910今天中午看见 hjg1988的关于JSON工具性能测试的帖子, ... -
Ognl/MVEL/Aviator/JSEL 四种表达式引擎执行效率对比
2010-08-09 00:48 17639为了配合一下JSEL的发布 ... -
表达式引擎JSEL介绍
2010-08-08 23:38 6602表达式引擎的定义这里我就不说了,先假设大家都知道^_^ 在 ... -
写了一个基于WiFi 的 Android 手机文件管理程序
2009-08-23 22:50 2650昨天晚上把机器上几首老歌下到手机上,结果几个文件名全乱码了,下 ... -
Google AppEngine 上开发做Java需要注意的问题
2009-04-12 18:36 1073这两天在搞Lite XML支持Google AppEngine ... -
午夜3点半,我的第一个Java版AppEngine运用诞生了。
2009-04-10 03:37 3174地址: http://litecompiler.appspot ... -
在eclipse平台上用xml schema 语法轻松打造Lite XML编辑器
2009-03-03 19:50 2876首先,不要被标题误导,我这里不是在讨论Eclipse插件开发。 ... -
一次同步不当的bug记录。
2009-02-25 19:31 977昨天晚上,收到QA报告 ... -
决定对JSEL属性计算做一点修改
2009-01-25 19:33 1341目前的JSEL表达式计算过程中,有一点与ECMA差别比较明显: ... -
简化一下我们那个日渐臃肿的Webwork
2008-12-21 21:10 1219很喜欢Webwork的简洁优雅。 实在不忍心看着他一天天的变得 ... -
JSON解析新办法:JSEL
2008-11-01 23:45 4893JSON解析和系列化功能,JSON官方网站是提供了官方的Jav ... -
关于逆波兰式处理表达式的问题。
2008-10-12 15:58 1736想写一个基于逆波兰式的表达式解析程序。 支持简单运算、属性读取 ... -
开始有点讨厌hibernate了
2008-06-14 23:19 1982确实,hibernate很好很强大。 但是我的每一次更新版本 ... -
关于Eclipse 下的Ant FTP操作
2008-04-25 21:05 2741编写一个部署脚本,需要吧打包的war文件上传到服务器上。 以 ... -
eclipse正则表达式在编码过程中的运用
2007-11-10 18:19 3437刚刚经历的一点小技巧,共享一下。 1。给代理函数加上空判断 ... -
这是hsqldb的bug?还是自己的用法不对。
2007-10-17 20:29 3519被一个貌似hsqldb bug的问题折磨了好几个小时。 把经过 ... -
Re: Java基本类型的疑问
2007-07-25 10:50 2983java虫 写道网上看得一些文章 int a = 3; ... -
代码生成工具示例工程
2007-07-06 13:49 9546大约两年前私下编写一 ... -
发布一个有点古老的代码生成工具
2007-06-29 17:21 5189已经有一年多没做java这块了,今天翻出这个一年前写的代码生成 ... -
中国象棋的webstart小程序
2007-06-14 10:42 4184刚发布JSA的webstart版,顺便吧这个古董级别的小程序也 ...
相关推荐
本篇文章主要介绍了浅谈Java模板引擎性能对比 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
当你只需要一部分功能时,大量无用的代码同样会拖累性能,基于以上考虑,方配网站模板引擎选择了另外一种模板方式。 方配网站模板引擎(FangPage Template)也简称为FPT,是一个基于ASP.NET的模板引擎(Template ...
不同的node.js模板引擎的性能比较怎么跑npm安装browserify -g 节点bin / www如何进入转到然后点击链接
goTemplateBenchmark 比较不同模板引擎的性能全功能模板引擎已移除预编译Go代码删除 Gorazor 快速模板英雄玉 特殊基准进行比较转到文本/模板(请勿将其用于HTML) StaticString-为整个模板使用一个静态字符串以具有...
当你只需要一部分功能时,大量无用的代码同样会拖累性能,基于以上考虑,方配网站模板引擎选择了另外一种模板方式。 方配网站模板引擎(FangPage Template)也简称为FPT,是一个基于ASP.NET的模板引擎(Template ...
用于比较Python模板引擎性能的工具包。 安装 首先,安装 。 我建议 。 然后克隆此存储库,并使其成为工作目录。 pipx install nox git clone https://github.com/bowmanjd/python-template-benchmarking.git cd ...
节点模板基准各种Node.js模板引擎的性能比较设置npm install npm start 比较页面将在localhost上运行注意:该项目需要io.js或Node.js(4.0或更高版本)才能运行。分析将这个小项目放在一起是为了评估在服务器上使用...
历史 (2009年HP 技术大会 提交的解决多环境部署问题>>:放在注释里的脚本) 应用范围 (全栈程序员或者前端或者美工) 功能概览 特色介绍 ...其他同类比较(freemark,jsp,angularjs,nodejs 等)
.NET控件的开发方式比较有利于提高开发效率,提高模块的重用性,但缺陷是性能上会有一些损失,例如不用数据绑定,显然也就不必判断数据来源和转换数据类型,不用页面控件和控件事件等,也就避免了使用ViewState,...
3、超高的性能:Beetl 远超过主流java模板引擎性能,如5-6倍于freemarker,2倍于传统jsp技术。而且消耗较低的CPU4、易于整合:Beetl能很容易的与各种web框架整合,如Spring MVC,JFinal,Struts,Nutz,Jodd,...
当你只需要一部分功能时,大量无用的代码同样会拖累性能,基于以上考虑,方配网站模板引擎选择了另外一种模板方式。 方配网站模板引擎(FangPage Template)也简称为FPT,是一个基于ASP.NET的模板引擎(Template ...
templayed.js 是一个兼容 Mustache 的 JavaScript 模板引擎,速度最快,体积最小。 性能比较: 标签:templayed
下面介绍几款 JavaScript 模板引擎 1. Mustache 基于javascript 实现的模板引擎,类似于 Microsoft’s jQuery template plugin,但更简单易用! 2. doT.js doT.js 包含为浏览器和Node.js 准备的 JavaScript 模板引擎。 ...
对pyke和pyclips引擎在功能特点、语法结构和性能表现上,做粗浅的对比。入门级、自制文档
Java的可扩展模板引擎 该引擎基于StringTemplate4,通过一些非常有用的功能对其进行了扩展,使其适用于更广泛的模板需求。 它旨在与ST4语法向后兼容。 用户功能 从1.0.0开始 通常,您会发现自己需要以模板引擎本身...
本文实例讲述了Twig模板引擎用法。分享给大家供大家参考,具体如下: 介绍 Twig是一个灵活、高效并且安全的PHP模板引擎。 如果你使用过Smarty、Django或者Jinja这类基于文本的模板引擎的话,那么你会觉得Twig是很...
快速模板Go的简单快速模板引擎。 Fasttemplate仅执行一项任务-... 以下是基准测试结果,将fasttemplate性能与text / template,string.Replace,strings.Replacer和fmt.Fprintf进行了比较: $ go test -bench=. -bench
方配ASP.NET模板引擎源码 v2.1,在ASP.NET开发中,一般情况下,网站的前台程序不使用.NET控件模式,性能都得到了提升。.NET控件的开发方式比较有利于提高开发效率,提高模块的重用性,但缺陷是性能上会有一些损失,...
在ASP.NET开发中,一般情况下,网站的前台....NET控件的开发方式比较有利于提高开发效率,提高模块的重用性,但缺陷是性能上会有一些损失,例如不用数据绑定,显然也就不必判断数据来源和转换数据类型,不用页面控件
数据库的性能优化主要有两个方面:减少查询比较次数、减少资源的征用。 使用工具Sql Server Profiler优化数据库的性能,减少资源的征用 SqlServer Profiler的功能 Sql Server Profiler的用法 定义跟踪 ...