皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Beetl 3.0.0.REALEASE 版本发布,Java 模板引擎

Beetl(发音同 Beetle) 是一款高性能,全功能,简单易用的 Java 模板(文本处理)引擎,广泛应用在动态页面,静态内容生成,代码生成,规则引擎等领域,自从 2011 年以来,一直在维护和改进,是国产里难得一直维护和保持世界领先的个人开源软件。

3.0 有如重大下改进

  • 支持俩对占位符和定界符,使得 Beetl 脚本语言更容易融入模板中
  • 去掉了模板中的类型推测功能,简化模板核心代码
  • 更容易的定制语法节点自定义实现,比如在线 CMS 应用中防止乱写 while(true) 无限循环
  • 去掉了手写字节码反射增强,改用 ASM,既然现在是 maven 年代,不再纯粹追求 jar 的体积
  • 其他小特性增加,比如循环中的 dataIndex,includeURL 标签等等
  • 模板一如继往完全兼容,高级定制需要调整一些包名

如果想快速熟悉 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,使之成为在中国个人开源里(相对于阿里,百度,京东投入巨资开源)优秀的开源的基础组件,我不擅长表达,借开源中国对他们进行感谢。

转自 https://www.oschina.net/news/107308/beetl-3-0-0-released

分享到:更多 ()