Beetl(发音同Beetle)是一款高性能,全功能,简单易用的Java模板(文本处理)引擎,广泛应用在动态页面,静态内容生成,代码生成,规则引擎等领域,自从2011年以来,一直在维护和改进,是国产里难得一直维护和保持世界领先的个人开源软件。
3.0 有如重大下改进
如果想快速熟悉Beetl,可以访问在线体验 http://ibeetl.com/beetlonline/
Beetl模板(文本处理)引擎是当今世界跑的最快的模板引擎,及时从JDK6到JDK8,还有一些新生代模板引擎诞生,Beetl仍然是性能王者,如下是一个性JMH能测试结果,来自 template-benchmark
Beetl之所以性能快,根本原因来自Beetl团队这8年的不断维护和对技术的追求。简要总结如下
一:通过字节码生成,代替反射的开销,如User对象的属性访问,生成如下字节码,极大提供了性能( 参考此文 )
public Object value(Object obj ,String attr){ int code = attr.hashCode(); switch(code): case 97: return ((User)obj).getA(); }
二:变量存放在数组里,而不是向其他模板引擎那样存在Map里,疯狂提高性能,如下模板
var a = 1; var b = "hello"+a;
对于其他模板内核,是一个Map维护变量表
context.put("a",1); content.put("b","hello"+context.get("a"));
对于Beetl内核,维护的是一个数组里
vars[0] =1; vars[1] = "hello"+vars[0];
三 模板静态文本优化
对于JSP或者其他模板,静态文本没有做优化,导致输出静态文本也非常慢,Beetl会合并静态文本,如果允许二进制流输出,甚至提前转化为byte流。如上性能测试并非模拟真实环境,如果真实环境,Beetl性能将是Freemarker的4-6倍。
四 Beetl脚本优化,Beetl会分析AST,对一些生成的节点执行类重新优化以达到性能最优,比如,对于变量user.name,和 user.wife.name执行,都是用VarRef,不过考虑到前者表达式只有一个属性,因此取消了循环,采用了类似循环展开的优化措施。
//user.wife.name,VarRef.java Attribute[] local = attr; int len = local.length(); for(int i=0;i<len;i++){ value = local.execute(context); } //user.name,去掉循环,VarRefOptimal.java localAttr1.execcute(context);
五:由于int,long,double等转字符串需要消耗很多代码,以int为例子,会涉及50行代码和俩次数组分配,Beetl内部做了优化,甚至对于1..1024的int类型,直接缓存对于的char数组,也极大了提高性能
对于Beetl的性能优化和细节优化远不止这些,这也是Beetl能超越Rocker,JSP这种编译成class执行的模板( 参考第三方测试 ),是世界当之无愧最快的模板引擎,也是最酷的模板引擎。
<dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>3.0.0.RELEASE</version> </dependency>
附录:Beetl第一个版本2011年在Sourceforge截图
Beetl团队先后有20多位开发者对Beetl团队的贡献,他们在Beetl不完善的时候不贬不喷,无论他们生活境遇如何,都在坚持不懈一起完善Beetl,使之成为在中国个人开源里(相对于阿里,百度,京东投入巨资开源)优秀的开源的基础组件,我不擅长表达,借开源中国对他们进行感谢。