在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字符。
测试结果:
更多信息参见:
http://code.google.com/p/httl
HTTL缺省使用Jdk的javax,tools编译字节码,需要500ms左右,如果换成Javassist编译,编译时间可以降到200ms左右,但字节码执行效率略差一点,如果想换成Javassist,只需在httl.properties中加入。
注:Javassist不支持1.5的语法,所以要设置java.version=1.4