JSP
与相关“所见即所得”模版的运行效率测试
虽然与
JSP
相关的模板技术有很多如:
Velocity
、
FreeMarker
之类,这些模板都有一个让我很不喜欢的地方,就是逻辑嵌入模板界面,对页面完整性破坏较大。给页面设计人员的工作带来麻烦。我所选用的二个模板
JDynamiTe
和
MiniTemplator
则对页面破坏性较小,同时也不能在模板中嵌入逻辑。熟悉
php
的朋友可能发现跟
phplib
的应用方式比较类似。
测试环境:
CPU
:
Intel T2050 1.6
内存:
1G
操作系统:
Windows XP Professional SP2
WEB
服务器:
Resin 3.0.23
测试方法:
分别编写五个不同的模板解析页面(具体见下方案说明),在每次模板类
NEW
之前获取系统纳秒时间,再在页面解析完成未输出之前再次获取系统纳秒时间,其差值直接输出到控制台。
在第一次刷新后,后五次连续刷新。每一套测试方案生成
6
个测试结果
由于测试未使用专业测试工具,其测试结果仅供参考。
模板方案说明
采用五种不出的模板方案,具体说明如下:
1.
JDynamiTe
JDynamiTe
是一个比早老的
JSP
模板工具,最新版本仍然是具于
jde1.1
开发。同时也是与
phplib
最为类似的一种模板技术,现已停止开发。
2.
MiniTemplator
这款模板同时存在
php
和
asp
的多个版本,整体代码比较小巧。
3.
MiniTemplatorCache
大体同上,只是在原有基础上添加了
MiniTemplator
对象的
Cache
技术,只需在第一次调用时生成一个
MiniTemplator
对象,再有相同的调用时省去
NEW
操作。
4.
MiniTemplator+AppString
虽然
MiniTemplator
为我们提供了对象缓存,可每个页面请求均需要读取一个模板文,增加了不必要的
I/O
开销。这个方案是在原第
3
套方案基础上,由
WEB
第一次部署起动时读取模板文件到
getServletContext().setAttribute
,也就是
application
空间,以后每次请求直从
application
取出,在大页量访问量的情况下省去不必要的
I/O
开销。
5.
JSP
这个不用多说,直接用最原始的
jsp
开发方法。
有必要说明的是由于
JDynamiTe
和
MiniTemplator
定义的模标签格式不一样,故而使用二个模板文件,总体上模板风格和代码量保持一致。
以下是测试结果:
原始时间(纳秒)
刷新次数
|
JDynamiTe
|
MiniTemplator
|
MiniTemplatorCache
|
MiniTemplator+AppString
|
JSP
|
第1次
|
256096990
|
75628441
|
8746473
|
1642579
|
37003899
|
第2次
|
116019979
|
9189667
|
6347633
|
2501103
|
452221
|
第3次
|
5493805
|
2500993
|
1415491
|
1274319
|
496462
|
第4次
|
2920735
|
1845188
|
1677043
|
782618
|
501132
|
第5次
|
6301250
|
2275586
|
3412602
|
879016
|
489043
|
第6次
|
4249490
|
2774440
|
1908338
|
1682103
|
504552
|
平均耗时(2-6次)
|
26997051.8
|
3717174.8
|
2952221.4
|
1423831.8
|
488682
|
转换后的时间
(
秒
)
刷新次数
|
JDynamiTe
|
MiniTemplator
|
MiniTemplatorCache
|
MiniTemplator+AppString
|
JSP
|
第1次
|
0.25609699
|
0.075628441
|
0.008746473
|
0.001642579
|
0.037003899
|
第2次
|
0.116019979
|
0.009189667
|
0.006347633
|
0.002501103
|
0.000452221
|
第3次
|
0.005493805
|
0.002500993
|
0.001415491
|
0.001274319
|
0.000496462
|
第4次
|
0.002920735
|
0.001845188
|
0.001677043
|
0.000782618
|
0.000501132
|
第5次
|
0.00630125
|
0.002275586
|
0.003412602
|
0.000879016
|
0.000489043
|
第6次
|
0.00424949
|
0.00277444
|
0.001908338
|
0.001682103
|
0.000504552
|
平均耗时(2-6次)
|
0.0269970518
|
0.0037171748
|
0.0029522214
|
0.0014238318
|
0.000488682
|
转换后的时间
(
毫秒
)
刷新次数
|
JDynamiTe
|
MiniTemplator
|
MiniTemplatorCache
|
MiniTemplator+AppString
|
JSP
|
第1次
|
256.09699
|
75.628441
|
8.746473
|
1.642579
|
37.003899
|
第2次
|
116.019979
|
9.189667
|
6.347633
|
2.501103
|
0.452221
|
第3次
|
5.493805
|
2.500993
|
1.415491
|
1.274319
|
0.496462
|
第4次
|
2.920735
|
1.845188
|
1.677043
|
0.782618
|
0.501132
|
第5次
|
6.30125
|
2.275586
|
3.412602
|
0.879016
|
0.489043
|
第6次
|
4.24949
|
2.77444
|
1.908338
|
1.682103
|
0.504552
|
平均耗时(2-6次)
|
26.9970518
|
3.7171748
|
2.9522214
|
1.4238318
|
0.488682
|


结论:
1.
JDynamiTe
是最慢的。由于开发的年代久远,
java1.1
版本的的代码制约语言发挥最大效率,在解析过程中且依赖于外部正则库。
ReadLine
的行读取增加不必要
I/O
开销。
2.
MiniTemplator
在采用默认的方案时(第二方案)仍然快过
JDynamiTe
,虽然默认方案也是读取文件,相比
JDynamiTe
的读取方式采取读取缓存到
StringBuilder
,再利用语言自身的正则支持进行解析。从第一眼看到
JDynamiTe
和
MiniTemplator
的代码时,感觉理论上
MiniTemplator
应该更快些。事实也证明的这一点。
3.
MiniTemplatorCache
相比默认的
MiniTemplator
的方案,这种方式节约了
NEW MiniTemplator
对象的时间,快也只是快一点。
4.
MiniTemplator+AppString
这个是这次模板方案里最快的,可以看到虽然只是减少了
I/O
的开销,可是这个效果却是惊人的,通过图示我们可以看到足足比默认方案快了近一倍。如果更进一步采用
MiniTemplatorCache+AppString
的方式,相信会更快一点。
最后,冠军当然是
MiniTemplator+AppString
。那
jsp
呢?无疑单纯的
jsp
效率其它模板都比不上,但这样却严重制约了美工制做和后期维护的能力。所以,在稍复杂的
web
应用中,我主张
jsp+html
的模式走开。
csdn的服务器太慢,下不了的朋友请留下E-mail。