web性能優化——JSP


一、啰嗦

  做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中讀取的性能優於,在頁面存儲讀取。但是此次的測試數據和我心中的結果差別還是比較大的,測試之前,認為性能差距會隨着變量的數量增多,而更加明顯,然而結果和我想的有些不一樣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM