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,使之成為在中國個人開源里(相對於阿里,百度,京東投入巨資開源)優秀的開源的基礎組件,我不擅長表達,借開源中國對他們進行感謝。
[admin
]