一、啰嗦
做web開發的都知道,性能的重要性就不必強調了。就前端展示的工作來說,jsp大家都熟悉html更熟悉;web服務器tomcat應該是最熟悉的了;web方面的基礎知識上來說,靜態頁面比動態頁面效率要高(什么是動態頁面什么是靜態頁面不說了),在項目初期或者孵化階段,人手少,工期短,資金更少,不可能按照高性能的架構一步到位,那么怎么在有效的資源上做出牛逼的東西呢——優化
jsp頁面中可以寫java代碼、el表達式、jstl標簽等。對於jsp里面的靜態標簽(html的標簽等)應該效率是最高的,其次應該是java了,因為jsp會被編譯為java代碼(理論,沒有測試),在接下來就是el和jstl了。
二、問題
今天遇到的一個問題是:
一些配置信息,可以從后台全局性的傳到jsp頁面中,然后進行資源的讀取;也可以在頁面中使用java代碼讀取這些靜態的配置,然后在模板里面使用jstl設置變量,再做訪問。
這兩種方式個人認為前者的效率會更高,可能自己知識面太窄,沒有充足的理論依據。
三、驗證
帶着問題,首先希望是在網上巴拉了一大圈,沒找到相關的文章;又搜了一些tomcat解析原理,沒找到有用的,直接DEMO試一下。
機器:個人pc(12g+256ssd+i5)
服務器:tomcat
框架:spring mvc
測試流程:每次會把tomcat停止后,重新啟動tomcat,進行第二次測試
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中讀取的性能優於,在頁面存儲讀取。但是此次的測試數據和我心中的結果差別還是比較大的,測試之前,認為性能差距會隨着變量的數量增多,而更加明顯,然而結果和我想的有些不一樣。