Java模板引擎 httl

openkk 13年前發布 | 31K 次閱讀 Java 模板引擎

在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屬性的指令,如: 

  1. <table if="user.role == 'admin'">  
  2.     <tr foreach="book in books">  
  3.         ...  
  4.      tr>  
  5. table>  



選型方面的區別:

  • Velocity采用JavaCC編譯成AST樹,解釋執行。
  • FreeMarker類似,只是采用FreeCC。
  • Smarty4j采用ASM生成字節碼。
  • HTTL采用先將模板轉譯成Java代碼,再由JDK或Javassist編譯成字節碼。


性能測試:

  • 模板內循環顯示100行數據。
  • 每模板各運行一萬次。
  • 模板大小約800字符。
  • 模板每次運行輸出內容約27K字符。


測試結果: 

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


更多信息參見: 
http://code.google.com/p/httl 

HTTL缺省使用Jdk的javax,tools編譯字節碼,需要500ms左右,如果換成Javassist編譯,編譯時間可以降到200ms左右,但字節碼執行效率略差一點,如果想換成Javassist,只需在httl.properties中加入: 

  1. compiler=com.googlecode.httl.support.compilers.JavassistCompiler  
  2. java.version=1.4  


注:Javassist不支持1.5的語法,所以要設置java.version=1.4

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!