www.e4938.cn-老师你下面太紧了拔不出来,99re8这里有精品热视频免费,国产第一视频一区二区三区,青青草国产成人久久

<button id="60qo0"></button>

<strike id="60qo0"></strike>
<del id="60qo0"></del>
<fieldset id="60qo0"><menu id="60qo0"></menu></fieldset>
  • 為什么JSP會(huì)比Beetl慢

    2018-03-19 16:52:26 csdn  點(diǎn)擊量: 評(píng)論 (0)
    許多人都不相信這個(gè)事實(shí),作為前端常用渲染技術(shù),JSP比Beetl慢。如果稍微了解這倆種技術(shù)的人,會(huì)分析:JSP是編譯成class的,而 Beetl總是

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

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

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

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

    • Time taken for tests:   0.656 seconds

    • Complete requests:      1000

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

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

    • Time taken for tests:   1.297 seconds

    • Complete requests:      1000

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

        究竟怎么回事情,使得編譯執(zhí)行的JSP執(zhí)行比解釋執(zhí)行的Beetl慢。基本上來說,Beetl并沒有做出超越常規(guī)的性能優(yōu)化,而是JSP本身性能優(yōu)化不夠導(dǎo)致的。

     

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

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

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

    Tomcat7 會(huì)編譯成為

    
    
    1. out.write("<html>\r\n"); 
    2.       out.write("<head>\r\n"); 
    3.       out.write("<meta http-equiv=\"Content-Type\" 
    4.             content=\"text/html; charset=ISO-8859-1\">\r\n"); 
    5.       out.write("<title>Test JSP</title>\r\n"); 
    6.       out.write("</head>\r\n"); 
    7.       out.write("<body>\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("</body>\r\n"); 
    14.       out.write("</html>"); 

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

    // 期望JSP的樣子

    
    
    1. out.write("<html>\r\n<head>\r\n ....<body>\r\n“); 
    2. String a = "Test JSP"
    3. out.write("\r\n“); 
    4. out.print(a ); 
    5. out.write("\r\n</body>\r\n</html>"); 

     

     

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

    
    
    1. public static void main(String[] args)throws Exception { 
    2.   String text = "<html>你好中文!你好中文!你好中文!</html>"
    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)制,會(huì)提高性能很多。而通常JSP,總是靜態(tài)文本多過JSP Code的

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

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

    
    
    1. <c:choose> 
    2.    <c:when test="${param.newFlag== '1' || param.newFlag== '2'}">  
    3.     <th>1 or 2  <font color="Red">*</font> 
    4.    </c:when>  
    5. </c:choose> 

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

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

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

    但事實(shí)并不是這樣,對(duì)于如上JSTL,編譯成

    
    
    1. // 實(shí)際上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, nullfalse)); 

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

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

    大云網(wǎng)官方微信售電那點(diǎn)事兒

    責(zé)任編輯:售電衡衡

    免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本站無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
    我要收藏
    個(gè)贊
    ?
    亚洲午夜日韩高清一区| 成年女人AA级毛片免费观看| 免费看电视剧| 亚洲国产日韩欧美一区二区三区| 国禁国产you女视频网站| 两根黑人粗大噗嗤噗嗤视频| 自拍一区在线观看| 国产精品无码av在线播放| 大地资源在线观看免费高清视频| 邻居少妇张开腿让我爽了在线观看|