日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
為什么JSP會比Beetl慢

許多人都不相信這個事實,作為前端常用渲染技術(shù),JSP比Beetl慢。如果稍微了解這倆種技術(shù)的人,會分析:JSP是編譯成class的,而 Beetl總是解釋執(zhí)行的。JSP肯定會比Beetl快。然而,事實并不是這樣,通過了許多性能測試,證明,Beetl還是要快的,如下是TEB模板引擎 性能基準(zhǔn)測試結(jié)果:

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站制作、烏蘭察布網(wǎng)絡(luò)推廣、小程序開發(fā)、烏蘭察布網(wǎng)絡(luò)營銷、烏蘭察布企業(yè)策劃、烏蘭察布品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供烏蘭察布建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

可以看出,代表Beetl的綠色的,性能高于代表JSP的黃色大約2倍。

還有個帖子來自osc:http://my.oschina.net/tangcoffee/blog/303865,壓力測試jsp和beetl,證明beetl性能是JSP的2倍,如下是截取的部分?jǐn)?shù)據(jù)

   采用jfinal+beetl模板,apache ab壓力測試結(jié)果

  • Time taken for tests:   0.656 seconds

  • Complete requests:      1000

  • Time per request:       32.813 [ms] (mean)

   未采用beetl,apache ab測試結(jié)果:

  • Time taken for tests:   1.297 seconds

  • Complete requests:      1000

  • Time per request:      64.844  [ms] (mean)

    究竟怎么回事情,使得編譯執(zhí)行的JSP執(zhí)行比解釋執(zhí)行的Beetl慢?;旧蟻碚f,Beetl并沒有做出超越常規(guī)的性能優(yōu)化,而是JSP本身性能優(yōu)化不夠?qū)е碌摹?/p>

    第一: JSP對靜態(tài)文本處理的不夠好 。

如果你看看JSP編譯的后的java代碼(以Tocmat7為例),你會發(fā)現(xiàn),JSP并沒有優(yōu)化好靜態(tài)文本輸出。如下一個JSP代碼

   
  
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
  2.     pageEncoding="UTF-8"%> 
  3.  
  4.  
  5.  
  6. Test JSP 
  7.  
  8.  
  9. <% 
  10. String a = "Test JSP"; 
  11. %> 
  12. <%=a %> 
  13.  
  14.  

Tomcat7 會編譯成為

 
 
  1. out.write("\r\n"); 
  2.       out.write("\r\n"); 
  3.       out.write("
  4.             content=\"text/html; charset=ISO-8859-1\">\r\n"); 
  5.       out.write("Test JSP\r\n"); 
  6.       out.write("\r\n"); 
  7.       out.write("\r\n"); 
  8. String a = "Test JSP"; 
  9.       out.write('\r'); 
  10.       out.write('\n'); 
  11.       out.print(a ); 
  12.       out.write("\r\n"); 
  13.       out.write("\r\n"); 
  14.       out.write(""); 

    可以看出,對于靜態(tài)文本,JSP會多次調(diào)用out.write方法,而write方法內(nèi)部,每次調(diào)用,都會做flush檢測等耗時機制。因此,更好的方式應(yīng)該是將靜態(tài)文本合并一次性輸出,應(yīng)該是下面這種會更好點

// 期望JSP的樣子

  
 
  1. out.write("\r\n\r\n ....\r\n“); 
  2. String a = "Test JSP"; 
  3. out.write("\r\n“); 
  4. out.print(a ); 
  5. out.write("\r\n\r\n"); 

第二  就算JSP的實現(xiàn)做了如上更改,靜態(tài)文本處理還有優(yōu)化空間。這是因為互聯(lián)網(wǎng)傳輸?shù)亩M(jìn)制,因此會存在一個將靜態(tài)文本轉(zhuǎn)成 byte[] 輸出的過程,這是一個耗費CPU操作的過程,也就是JSP里的write操作,內(nèi)部還大量的編碼,而且,隨著JSP一次次渲染,編碼是一次一次重復(fù),實驗 證明,這極大的降低了JSP性能。通過如下偽代碼可以驗證

  
 
  1. public static void main(String[] args)throws Exception { 
  2.   String text = "你好中文!你好中文!你好中文!"; 
  3.   { 
  4.    //模擬jsp 
  5.    long start = System.currentTimeMillis(); 
  6.    for(int i=0;i<1000000;i++){ 
  7.     byte[] bs = text.getBytes("UTF-8"); 
  8.     write(bs); 
  9.    } 
  10.    long end = System.currentTimeMillis(); 
  11.    System.out.println("jsp total="+(end-start)); 
  12.   } 
  13.  
  14.   { 
  15.    // 模擬beetl 
  16.    long start = System.currentTimeMillis(); 
  17.    byte[] bs = text.getBytes("UTF-8");   
  18.    for(int i=0;i<1000000;i++){   
  19.     write(bs); 
  20.    } 
  21.    long end = System.currentTimeMillis(); 
  22.    System.out.println("beetl total="+(end-start)); 
  23.   } 
  24.  
  25.  
  26. public static void write(byte[] bs){ 
  27.  

輸出是:

  • jsp total=228

  • beetl total=3

可見Beetl將靜態(tài)文本預(yù)先編碼成二進(jìn)制,會提高性能很多。而通常JSP,總是靜態(tài)文本多過JSP Code的

第三,JSP在JSTL做的不夠完美,也導(dǎo)致性能很差。

由于JSP是基于Java語言,語言本身是OO的,很多地方不適合模板場景使用,因此,自然而然采用JSTL來彌補JSP的不足,這也是后來很多項目都基本上采用了JSTL來寫模板。然而,JSTL的性能更加有問題。比如下一個簡單的JSTL判斷

 
 
  1.  
  2.      
  3.     1 or 2  
  4.      
  5.  

在我最初的想象里,我認(rèn)為jsp至少會編譯成如下代碼:

//期望JSP能編譯成如下代碼

  
 
  1. if(request.getParameter("newFlag").equals("1") 
  2.    ||request.getParameter("newFlag").equals("2")){ 
  3.  
  4.     out.print(...) 

但事實并不是這樣,對于如上JSTL,編譯成

 
 
  1. // 實際上JSP編譯的代碼 
  2. out.write((java.lang.String) 
  3.   org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate( 
  4. "${param.newFlag== '1' || param.newFlag== '2'}", 
  5. java.lang.String.class, 
  6. (javax.servlet.jsp.PageContext)_jspx_page_context, null, false)); 

也就是,JSP并沒有如預(yù)期的預(yù)編譯成java代碼,而是動態(tài)解釋執(zhí)行了 test條件,這樣,性能不差才怪呢.

綜上所述,JSP之所以在基準(zhǔn)測試還是實際的測試,都比Beetl慢不少,是因為他靜態(tài)文本輸出方面沒有去做積極的優(yōu)化。像JSTL那樣的的解釋執(zhí)行也極大的拖了JSP后退,而Beetl避免了這些問題。


分享標(biāo)題:為什么JSP會比Beetl慢
本文網(wǎng)址:http://www.5511xx.com/article/djpsdgs.html