在07的时候,写过一个模板引擎,当时叫CommonTemplate,后来功能越来越多,性能却越来越差,在金大为发给我性能对比结果后,看到惨不忍睹的差距,就打算抛弃原设计进行重写,但因工作忙,就搁置了,最近看温少发了几个EL和JSON的解析器,有点手痒,就抽了个周未,拿出来再改了改,主要将模板改成了字节码编译,并简化了语法及缩小使用范围,只针对HTML场景使用,并将名称改成了HTTL,名字含义是把HTML中的M(Marker)改成了T(Template),放在GoogleCode上:http://code.google.com/p/httl,性能和Java硬编码输出模板内容差不多,比Velocity/FreeMarker等快10倍左右。

语法方面的区别: 
发现基于文本指令的,基于HTML标签的,基于HTML注释的,都有不少模板引擎实现, 
为了标新立异以及使用的直观性,HTTL采用基于HTML属性的指令。


选型方面的区别:

  • Velocity采用JavaCC编译成AST树,解释执行。
  • FreeMarker类似,只是采用FreeCC。
  • Smarty4j采用ASM生成字节码。
  • HTTL采用先将模板转译成Java代码,再由JDK或Javassist编译成字节码。


性能测试:

  • 模板内循环显示100行数据。
  • 每模板各运行一万次。
  • 模板大小约800字符。
  • 模板每次运行输出内容约27K字符。


测试结果: 

<TABLE style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid" class=bbcode> Engine Compile Run TPS Freemarker 125ms 16,934ms 590t/s Velocity 110ms 19,278ms 518t/s Smarty4j 78ms 21,653ms 461t/s Httl 547ms 2,077ms 4,814t/s Java 0ms 2,016ms 4,960t/s</TABLE>


更多信息参见: 
http://code.google.com/p/httl 

HTTL缺省使用Jdk的javax,tools编译字节码,需要500ms左右,如果换成Javassist编译,编译时间可以降到200ms左右,但字节码执行效率略差一点,如果想换成Javassist,只需在httl.properties中加入。
注:Javassist不支持1.5的语法,所以要设置java.version=1.4 

<DIV class=date>收录时间:2011-09-14 17:24:54</DIV>