作web開發的都知道,性能的重要性就沒必要強調了。就前端展現的工做來講,jsp你們都熟悉html更熟悉;web服務器tomcat應該是最熟悉的了;web方面的基礎知識上來講,靜態頁面比動態頁面效率要高(什麼是動態頁面什麼是靜態頁面不說了),在項目初期或者孵化階段,人手少,工期短,資金更少,不可能按照高性能的架構一步到位,那麼怎麼在有效的資源上作出牛逼的東西呢——優化html
jsp頁面中能夠寫java代碼、el表達式、jstl標籤等。對於jsp裏面的靜態標籤(html的標籤等)應該效率是最高的,其次應該是java了,由於jsp會被編譯爲java代碼(理論,沒有測試),在接下來就是el和jstl了。前端
今天遇到的一個問題是:java
一些配置信息,能夠從後臺全局性的傳到jsp頁面中,而後進行資源的讀取;也能夠在頁面中使用java代碼讀取這些靜態的配置,而後在模板裏面使用jstl設置變量,再作訪問。web
這兩種方式我的認爲前者的效率會更高,可能本身知識面太窄,沒有充足的理論依據。spring
帶着問題,首先但願是在網上巴拉了一大圈,沒找到相關的文章;又搜了一些tomcat解析原理,沒找到有用的,直接DEMO試一下。tomcat
機器:我的pc(12g+256ssd+i5)服務器
服務器:tomcat架構
框架:spring mvcmvc
測試流程:每次會把tomcat中止後,從新啓動tomcat,進行第二次測試app
controller定義:
jstl方法中直接返回視圖;var方法中在視圖中添加變量;以下:
@RequestMapping("jstl") public ModelAndView jstlTest() { ModelAndView mv = new ModelAndView(); mv.setViewName("jstl"); return mv; } @RequestMapping("var") public ModelAndView varTest() { ModelAndView mv = new ModelAndView(); mv.addObject("v", 120); mv.setViewName("var"); return mv; }
JSP頁面:
jstl.jsp頁面,使用jstl設置變量,而後使用el表達式在讀出來。以下:
<c:set var="v" value="120"></c:set> ${v }
var.jsp頁面,在直接讀取controller中的變量。以下:
${v }
一切就緒了,下面是測試程序,對指定頁面訪問10w次:
@Test public void testJstl() { long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { try { String document = Jsoup.connect("http://localhost:8080/news/test/jstl").get().body().text(); System.out.println(document); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } long end = System.currentTimeMillis(); System.out.println(end + "-" + start + "=" + (end - start)); } @Test public void testVar() { long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { try { String document = Jsoup.connect("http://localhost:8080/news/test/var").get().body().text(); System.out.println(document); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } long end = System.currentTimeMillis(); System.out.println(end + "-" + start + "=" + (end - start)); }
測試結果:
變量設置方式 |
開始時間 |
結束時間 |
耗時 |
controller |
1479991964321 |
1479991897879 |
66442 |
jstl |
1479991819067 |
1479991750981 |
68086
|
只有一個變量的狀況的下,訪問10次,在controller中設置變量,比使用jstl中設置變量快了1718毫秒
測試兩個變量的狀況:
jstl頁面以下:
<c:set var="v" value="120"></c:set> <c:set var="v1" value="120"></c:set> ${v } ${v1 }
var頁面以下:
${v }
${v1 }
controller中只有var方法有變更,以下:
@RequestMapping("var") public ModelAndView varTest() { ModelAndView mv = new ModelAndView(); mv.addObject("v", 120); mv.addObject("v1", 120); mv.setViewName("var"); return mv; }
測試結果:
變量設定方式 | 開始時間 | 結束時間 | 耗時 |
controller | 1479991384043 | 1479991316874 | 67169 |
jstl | 1479991153541 | 1479991084654 | 68887 |
測試一共取了五個值測試,不知道準確性怎麼樣,但願高手指點一二
變量個數 |
變量設置方式 |
開始時間 |
結束時間 |
耗時 |
1 |
controller |
1479991964321 |
1479991897879 |
66442 |
jstl |
1479991819067 |
1479991750981 |
68086 |
|
2 |
controller |
1479991384043 |
1479991316874 |
67169 |
jstl |
1479991153541 |
1479991084654 |
68887 |
|
4 |
controller |
1479996126484 |
1479996055448 |
71036 |
jstl |
1479995801444 |
1479995716369 |
85075 |
|
8 |
controller |
1479996391785 |
1479996321319 |
70466 |
jstl |
1479996573521 |
1479996500165 |
73356 |
|
16 |
controller |
1479997049876 |
1479996974712 |
75164 |
jstl |
1479996906690 |
1479996830374 |
76316 |
測試結果在圖表中展現,以下:
無論從數據仍是折線圖,均可以明顯得出在controller中設置變量,使用el在jsp中讀取的性能優於,在頁面存儲讀取。可是這次的測試數據和我心中的結果差異仍是比較大的,測試以前,認爲性能差距會隨着變量的數量增多,而更加明顯,然而結果和我想的有些不同。