成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么JSP會比Beetl慢

開發 后端
許多人都不相信這個事實,作為前端常用渲染技術,JSP比Beetl慢。如果稍微了解這倆種技術的人,會分析:JSP是編譯成class的,而 Beetl總是解釋執行的。JSP肯定會比Beetl快。

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

 

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

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

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

  • Time taken for tests:   0.656 seconds

  • Complete requests:      1000

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

   未采用beetl,apache ab測試結果:

  • Time taken for tests:   1.297 seconds

  • Complete requests:      1000

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

    究竟怎么回事情,使得編譯執行的JSP執行比解釋執行的Beetl慢?;旧蟻碚f,Beetl并沒有做出超越常規的性能優化,而是JSP本身性能優化不夠導致的。

    第一: JSP對靜態文本處理的不夠好 。

如果你看看JSP編譯的后的java代碼(以Tocmat7為例),你會發現,JSP并沒有優化好靜態文本輸出。如下一個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 會編譯成為

  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>"); 

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

// 期望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的實現做了如上更改,靜態文本處理還有優化空間。這是因為互聯網傳輸的二進制,因此會存在一個將靜態文本轉成 byte[] 輸出的過程,這是一個耗費CPU操作的過程,也就是JSP里的write操作,內部還大量的編碼,而且,隨著JSP一次次渲染,編碼是一次一次重復,實驗 證明,這極大的降低了JSP性能。通過如下偽代碼可以驗證

  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將靜態文本預先編碼成二進制,會提高性能很多。而通常JSP,總是靜態文本多過JSP Code的

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

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

在我最初的想象里,我認為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, nullfalse)); 

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

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

責任編輯:王雪燕
相關推薦

2024-05-27 00:00:01

2024-03-08 07:53:19

LockMonitor線程

2015-11-09 09:35:15

跳槽加薪內部調薪

2018-06-22 10:18:02

2009-12-25 09:41:51

2024-09-27 11:46:51

2018-08-16 08:03:21

Python語言解釋器

2018-09-03 11:26:51

硬盤容量標注

2024-04-15 04:00:00

C#反射代碼

2016-12-28 11:28:19

.NET反射

2021-05-29 06:23:47

webpack esbuild

2020-08-14 09:11:29

RedisQPS數據庫

2020-03-05 16:55:56

索引數據庫SQL

2020-03-18 14:08:48

Windows操作系統功能

2018-10-28 15:40:23

Python編程語言

2025-02-04 12:17:06

LIMIT數據性能

2020-10-29 09:19:11

索引查詢存儲

2022-06-30 08:01:53

mysqlmyisamcount

2020-08-10 11:20:59

索引MySQL數據庫

2020-12-22 09:10:05

SQLMysql 數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久天堂网 | 精品欧美一区二区精品久久久 | 成人免费影院 | 视频一区二区在线 | 欧产日产国产精品视频 | 91视频在线观看免费 | 天堂在线www| 日韩不卡在线 | 久久久www成人免费无遮挡大片 | 在线观看日本网站 | 精品国产乱码久久久久久闺蜜 | 久久久久久久久久久成人 | 婷婷精品 | 国产国拍亚洲精品av | 国产精品日韩一区二区 | 成人亚洲性情网站www在线观看 | 成人一区精品 | 成人国产毛片 | 日韩国产精品一区二区三区 | 国产亚洲高清视频 | 在线国产精品一区 | 精品综合 | 黄在线| 日韩激情视频一区 | 国产精品一区二区av | 成人亚洲性情网站www在线观看 | 日韩三级免费网站 | 亚洲激情在线视频 | 日本午夜免费福利视频 | 一区| 国产精品久久久亚洲 | 精品国产不卡一区二区三区 | 国产成人a亚洲精品 | 精品欧美一区二区三区久久久 | 亚洲视频在线播放 | 亚洲国产情侣自拍 | 台湾佬成人网 | 91在线视频观看免费 | 国产美女在线精品免费 | 中文字幕在线精品 | 亚洲一区二区在线 |