Struts2、SpringMVC、Servlet(Jsp)性能對比 測試 。 Servlet的性能應該是最好的,可以做為參考基準,其它測試都要向它看齊,參照...

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

Struts2、SpringMVC、Servlet(Jsp)性能對比 測試

Servlet的性能應該是最好的,可以做為參考基準,其它測試都要向它看齊,參照它。

做為一個程序員,對于各個框架的性能要有一個基本的認知,便于選型時做出正確的決策。

在測試中發現了什么也不要大喊大叫,因為這些都是Java程序員的基礎知識。 人人都要了解。

---------------------------------------------------------------------------------------

?

建議先閱讀《你想建設一個能承受500萬PV/每天的網站嗎? 》一文,了解一些測試的基本概念。在測試開始前就有一個性能好與壞的標準。再用這個標準來檢驗你程序。

---------------------------------------------------------------------------------------
測試環境說明:
服務器: 4G內存,至強3.0 (4核超線程)CPU,windows 2003
測試機:筆記本 2G內存,p8600 雙核CPU,windows XP
網絡:100Mb局域網
測試軟件:
Jmeter 2.3.4??? 分配了512M內存
tomcat 6? 默認內存大小

---------------------------------------------------------------------------------------
測試配置如下圖: 其實jmeter還是很弱的,我打開"集合點(synchronizing Timer)","察看結果樹","用表格查看結果"中的任何一個都會導致測試結果中的性能下降和小部分請求的響應出錯(可能是線程數太多了),所以禁用了。只啟用了cookie管理器。


---------------------------------------------------------------------------------------
Tomcat6.0 配置文件的說明 ,做測試之前是要整清楚的。
默認的Server.xml中如下

Xml代碼 ? 收藏代碼
  1. <Connector?port="8080"?maxHttpHeaderSize="8192"???
  2. maxThreads="150"?minSpareThreads="25"?maxSpareThreads="75"???
  3. enableLookups="false"?redirectPort="8443"?acceptCount="100"???
  4. connectionTimeout="20000"?disableUploadTimeout="true"?/>???

?
enableLookups
是否允許DNS查詢,當web應用程序要通過域名服務器查找機器名轉換為IP地址時。會使用DNS查詢,需要占用網絡,延長較長
maxThreads
Tomcat可創建的最大的線程數,每一個請求須要一個線程來處理,原來的150太小了,我們測試時并發會超過他的。
acceptCount
指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,就是被排隊的請求數,超過這個數的請求將拒絕連接。
connnectionTimeout
網絡連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為20000毫秒。
minSpareThreads
Tomcat初始化時創建的線程數
maxSpareThreads
一旦創建的線程中空閑線程超過這個值,Tomcat就會關閉不再需要的socket線程。

注意:maxThreads 設置為500 ,也就是Tomcat最多同時使用500個線程處理500個并發(服務器CPU不錯,500沒問題),不要發生 排隊等待的情況以免影響測試成績, 為下面的壓力測試做好準備。

---------------------------------測試開始了-------------------------------------------
測試時服務器CPU使用率 10%
測試時測試機CPU使用率 100%(測試機不行啊,主要是
Jmeter的性能一般,又吃內存,測試機p8600 雙核CPU還是很強的 )
每次測試CPU都這樣,就統一寫這里了。

測試1:JSP頁面--2213個請求/秒
100并發,循環100次,共10000個請求,請求一個大小3.34KB的jsp頁面。



測試2:JSP頁面--1889個請求/秒
100并發,循環100次,共10000個請求,請求一個servlet總控制器,驗證權限后(很簡單),new一個Action,再轉發到一個大小3.34KB的jsp頁面。



測試3:HTML頁面--2607個請求/秒
100并發,循環100次,共10000個請求,請求一個3.2KB的html頁面。



測試4:
HTML頁面-- 833個請求/秒
100并發,循環100次,共10000個請求,請求一個13.4KB的html頁面。與上面比是只是文件大了一些,把網卡跑滿了 ,網卡成為了性能瓶頸,RPS降了不少!!



測試5: Spring MVC ? 2012個請求/秒
100并發,循環100次,共10000個請求,請求一個spring3 MVC的action,再轉發到一個0.8K的JSP,其內容是簡單的html



測試6:
Spring MVC ?? 1800-1924個請求/秒
100并發,循環100次,共10000個請求,請求一個spring3 MVC的action,兩個參數類型轉換為int、Date,再new 一個List,再轉發到一個1.3K的JSP,用JSTL標簽顯示List中的內容。

JSTL標簽內容是如下,看來JSTL標簽性能還是不錯的。

Java代碼 ? 收藏代碼
  1. <c:if?test="${empty?list}">???
  2. <tr>???
  3. <td?align="center">無記錄!</td>???
  4. </tr>???
  5. </c:if>???
  6. <c:if?test="${not?empty?list}">???
  7. <tr>???
  8. <th>從?1?開始的迭代計數</th>???
  9. <th>從?0?開始的迭代計數</th>???
  10. <th>產品名稱</th>???
  11. </tr>???
  12. <c:forEach?items="${list}"?var="item"?varStatus="s">???
  13. <tr?bgcolor=${s.index%2==0?"#E2E2E2":""}>???
  14. <td?align="center">${s.count}&nbsp;</td>???
  15. <td?align="center">${s.index}&nbsp;</td>???
  16. <td?align="center">${item}&nbsp;</td>???
  17. </tr>???
  18. </c:forEach>???
  19. </c:if>???

?
測試7: 訪問一張圖片(srping方式一) ? 1997個請求/秒
100并發,循環100次,共10000個請求. 因為我使用了spring3 MVC,攔截/,所以圖片不能訪問,所以添加了:

Xml代碼 ? 收藏代碼
  1. <servlet-mapping>????????
  2. ????<servlet-name>default</servlet-name>????????
  3. ????<url-pattern>*.jpg</url-pattern>????????
  4. </servlet-mapping>???

?
走默認的servlet,來訪問2.5K的圖片



測試8: 訪問一張圖片 (srping方式二) ?? 1967個請求/秒
100并發,循環100次,共10000個請求,因為我使用了spring3 MVC,攔截/,所以圖片不能訪問,所以添加了:
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
來訪問2.5K的圖片,會走spring的可匹配的一個攔截器。

?

?


測試9:Struts2? 使用官方提供的示例程序 (使用了Struts2標簽 )? 幾十個請求/秒
100并發,循環1次,沒有循環100次,因為strtus2在這次測試中響應太慢了,我等不起了,所以單個url的測試樣本從10000降到了100.一共11個url,共1100個樣本。
"spring" 使用的就是前面“測試5”的URL,放在這里是為了與strtus2對比的。
"html"?? 使用的就是前面“測試3”的URL,放在這里是為了與strtus2對比的。
"struts2-1" 使用的是官方自帶的示例項目,名稱是struts2-blank-2.1.8.1.war
"struts2-2" 使用的是官方自帶的示例項目,名稱是struts2-showcase-2.1.8.1.war,我在其中隨便選了一個action來做測試
"struts2-3" 同上
"struts2-4" 同上
"struts2-5" 同上
"struts2-6" 同上
"struts2-7" 同上
"struts2-8" 同上
"struts2-9" 同上
未對Struts2做優化,使用的都是官方帶的示例,Struts2的測試結果不理想,放在這里做一個參考。“struts2-1”是struts2中測試成績是本次最高的,但也不十分理想。



測試10:Struts2 ? 官方提供的 示例程序 (使用Struts2標簽--s:property) ? 1192個請求/秒
上一個測試結果糟糕的太離譜了,第二天,想了想又開始重新測試,使用的還是struts2官方提供的struts2-blank-2.1.8.1.war示例。

訪問下面的action: ?? http://192.168.0.5/struts2/example/HelloWorld.action?? ,action內容很簡單就是轉發到一個JSP。

下圖是使用官方示例中默認的action,我沒有修改,結果如下圖

這里要說一說轉發到的jsp中的內容,其中有struts2標簽,如下:

Xml代碼 ? 收藏代碼
  1. <s:property?value="message"/>???
  2. <s:url?id="url"?action="HelloWorld">???
  3. ?????<s:param?name="request_locale">en</s:param>???
  4. </s:url>???
  5. <s:a?href="%{url}">English</s:a>??

?

?

測試11:Struts2 ? 官方提供的 示例程序 (不使用Struts2標簽) ? 1976個請求/秒--優秀啊

?

我把“測試10”中的jsp文件內容改了,刪除了所有的struts2標簽,只輸出一行文本,測試結果如下圖:

天啊,性能超出我的想像,性能太好了,達到了我的要求。看來一定是struts2標簽拖了后腿。

?

?

測試12:Struts2 ? 官方提供的 示例程序 (使用Struts2標簽--s:form) ? 426個請求/秒
為了讓現象復現,我把 “測試10”中 jsp又改了,jsp中換用了其它的struts2標簽 ,測試結果如下圖:

使用的標簽是:

Xml代碼 ? 收藏代碼
  1. <s:form?action="Login">???
  2. ????<s:textfield?key="username"/>???
  3. ????<s:password?key="password"?/>???
  4. ????<s:submit/>???
  5. </s:form>??

?

?

?

?

=====================================================

結論:

struts2框架性能很好, 但struts2的標簽性能太差了。 要避免使用 struts2標簽。
Struts2 由于采用了 值棧、OGNL表達式、struts2標簽庫等,會導致性能下降,很嚴重的下降。如果避免或減少使用這些,性能還是很好的。
Struts2的
多層攔截器、 多實例action性能都很好,并不是 導致性能問題的原因。

注:以上測試都沒有數據庫,也沒有復雜業務,action和jsp中內容很簡單,目的就是測試MVC部分的性能。

---------------------------------------------------------------------------------------
其它測試文章:
http://zhaoshg.iteye.com/blog/356231
http://www.iteye.com/topic/679543

MVC框架性能比較
http://wenku.baidu.com/view/148d7e34eefdc8d376ee32ac.html

spring3mvc與struts2比較
http://www.iteye.com/topic/646240

---------------------------------------------------------------------------------------

?

附:幾種標簽和框架組合解析數據時候的 性能測試對比

一、 數據
數據通過查詢日志表得到數據,共 1302 條數據,將查詢出的數據放入一個靜態 List 中,保證每次請求的數據相同。

測試頁面的元素相同,只是在取數據方式上不同。


二、 測試目標

1、 在 JSP 頁面使用 struts2 標簽的性能;

2、 在 JSP 頁面使用 JSTL 標簽的性能;

3、 在 Freemarker 頁面使用 struts2 標簽的性能;

4、 在 Freemarker 頁面使用 JSTL 標簽的性能;

5、 在 Freemarker 頁面使用其本身的數據加載方式的性能。


三、 加載耗時對比

時間: ms?????????? 注:每一次對比都是在同一時間段按同一順序依次執行下列幾種方式

?

?

?

?

struts2

JSTL C

Freemarker-struts2

Freemarker-C

Freemarker

第一次

306

58

1618

?

41

第二次

202

52

1643

?

39

第三次

211

58

2047

?

36

第四次

196

49

1621

?

28

第五次

218

52

1607

?

40

第六次

303

331

1857

?

45

第七次

210

50

1671

?

33

第八次

311

51

1699

?

47

第九次

462

55

2180

?

37

第十次

218

46

1721

?

42

平均值

263.7

80.2

1766.4

?

38.8

去掉最高和最低

223.75

53.125

1547.125

?

39.125

?

?

?轉賬于
http://elf8848.iteye.com

?

轉載于:https://my.oschina.net/longload/blog/710526

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度相機(三)--三種方案對比

from&#xff1a;https://blog.csdn.net/app_12062011/article/details/52511701RGBD方案對比&#xff1a;關鍵技術規格&#xff1a; 1.檢測范圍&#xff1b; 2.檢測精度&#xff1b; 3.檢測角度&#xff1b; 4.幀率。 5.模塊大小 6.功耗 目前主流的深度攝像頭方案在檢測距離上…

Activity隱式啟動IntentFilter

時間&#xff1a;2016年3月4日09:54:02IntentFilter過濾信息&#xff1a;action、category、dataaction&#xff1a;1.Intent中的action必須能夠和過濾條件中的action匹配&#xff0c;過濾條件中可以有多個action。2.Intent中如果設置多個action則過濾條件中必須至少有同樣數量…

基于圖像分割的立體匹配方法

1.緒論 立體匹配是三維重建系統的關鍵步驟&#xff0c;并且作為一種非接觸測量方法在工業以及科研領域具有重要的應用價值。為了完成匹配工作以及獲取場景的稠密視差圖&#xff0c;可以通過構建能量函數對應立體匹配的約束條件。復雜能量函數的全局最優解通常是NP難問題。相對于…

深度相機之TOF原理詳解

/*******************************************************************************************************************本文轉載源鏈接沒有找到&#xff0c;若有幸被原創作者訪問到&#xff0c;請留下原出處&#xff0c;我會更新&#xff0c;謝謝&#xff0c;轉載至我的博…

nodejs npm常用命令

npm是一個node包管理和分發工具&#xff0c;已經成為了非官方的發布node模塊&#xff08;包&#xff09;的標準。有了npm&#xff0c;可以很快的找到特定服務要使用的包&#xff0c;進行下載、安裝以及管理已經安裝的包。 1、npm install moduleNames&#xff1a;安裝Node模塊安…

centos 7 /etc/rc.local 開機不執行的問題

最近發現centos7 的/etc/rc.local不會開機執行&#xff0c;于是認真看了下/etc/rc.local文件內容的就發現了問題的原因了 1234567891011#!/bin/bash# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES## It is highly advisable to create own systemd services or udev rules# …

深度相機(二)--結構光深度測距

原文&#xff1a; http://blog.sina.com.cn/s/blog_80ce3a550100wg5j.html http://blog.csdn.net/u013360881/article/details/51395427 網上資源&#xff1a;http://eia.udg.es/~qsalvi/recerca.html 結構光編碼&#xff1a; 在3D 的深度獲取上&#xff0c;最為常見的方法是類…

幾種特別的顏色參數

switch (buttonIndex) { case 0: aColor [UIColor redColor]; bColor [UIColor colorWithRed:0.97 green:0.68 blue:0.75 alpha:1.0];// 鴇色 break; case 1: aColor [UIColor orangeColor]; bColor [UIColor colorWithRed:1.0 green:0.87 blue:0.72 alpha:1.0];// 肌色 br…

linux 程序包管理5 編譯安裝

1.二進制程序的訪問方法vim /etc/profile.d/apache.shPATH/usr/local/apache/bin:/usr/local/apache/sbin$PATHexport PATH2.頭文件輸出給系統ln -sv /sur/local/apache/include /usr/include/httpd3.庫文件輸出vim /etc/ld.so.conf.d/httpd.conf/usr/local/apache/binldconfig…

用python實現模擬登錄人人網

用python實現模擬登錄人人網 字數4068 閱讀1762 評論19 喜歡46我決定從頭說起。懂的人可以快速略過前面理論看最后幾張圖。 web基礎知識 從OSI參考模型&#xff08;從低到高&#xff1a;物理層&#xff0c;數據鏈路層&#xff0c;網絡層&#xff0c;傳輸層&#xff0c;會話層&a…

雙目相機--雙目視差與深度距離關系推導詳解

相機成像的模型如下圖所示&#xff1a; P為空間中的點&#xff0c;P1和P2是點P在左右像平面上的成像點&#xff0c;f是焦距&#xff0c;OR和OT是左右相機的光心。由下圖可見左右兩個相機的光軸是平行的。XR和XT是兩個成像點在左右兩個像面上距離圖像左邊緣的距離。 -----------…

SQL Server有這些屬性嗎

2019獨角獸企業重金招聘Python工程師標準>>> Navicat for SQL Server是一個全面的圖形化方式管理數據庫&#xff0c;可進行創建、編輯和刪除全部數據庫對象&#xff0c;例如表、視圖、函數、索引和觸發器&#xff0c;或運行SQL查詢和腳本&#xff0c;查看或編輯BLOB…

Android中常見功能包描述

在Android中&#xff0c;各種包寫成android.*的方式&#xff0c;重要包的描述如下所示&#xff1a;android.app &#xff1a;提供高層的程序模型、提供基本的運行環境android.content&#xff1a;包含各種的對設備上的數據進行訪問和發布的類android.database &#xff1a;通過…

【立體視覺】雙目立體標定與立體校正

from&#xff1a;https://blog.csdn.net/u011574296/article/details/73826420 參考&#xff1a; 機器視覺學習筆記&#xff08;6&#xff09;——雙目攝像機標定參數說明 機器視覺學習筆記&#xff08;8&#xff09;——基于OpenCV的Bouguet立體校正 雙攝像頭立體成像(三)-畸變…

bootstrap .col-md-6 文字居中問題處理

轉載于:https://www.cnblogs.com/benbenfishfish/p/5672520.html

使用jd-gui+javassist修改已編譯好的class文件

1.原因&#xff1a;因為公司代碼管理不當導致源碼丟失&#xff0c;只好已編譯好的class文件進行修改 2.首先先在myeclipse中新建java項目并導入javassist 3.將需要修改的文件放到指定文件夾下 4..在項目中添加以下代碼 package dtj;import javassist.ClassPool; import javassi…

機器視覺學習筆記(4)——單目攝像機標定參數說明

from&#xff1a;https://blog.csdn.net/xuelabizp/article/details/50314633機器視覺學習筆記&#xff08;4&#xff09;——單目攝像機標定參數說明 標簽&#xff1a; 機器視覺1.針孔攝像機模型 在介紹攝像機標定參數之前&#xff0c;需要先簡單說一下針孔攝像機的原理。投影…

mysql 5.6 binlog組提交

mysql 5.6 binlog組提交實現原理http://blog.itpub.net/15480802/viewspace-1411356 Redo組提交 Redo提交流程大致如下 lock log->mutex write redo log buffer to disk unlock log->mutex fsync Fsync寫磁盤耗時較長且不占用log->mutex&#xff0c;也就是其執行期間其…

python基礎(正則表達式)

http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 轉載于:https://www.cnblogs.com/wanderingzj/p/5253325.html

LinuxShell腳本之利用rsync+ssh實現Linux文件系統遠程備份

功能介紹&#xff1a;該腳本用于定期&#xff08;結合crontab一起使用&#xff09;將本地目錄通過rsyncssh傳輸到遠程服務器&#xff0c;每次執行都生成一個帶有以時間命名的目錄&#xff0c;并且當前最新版本的數據鏈接到一個名字叫current的符號鏈接上&#xff0c;便于查找和…