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.mzph.cn/news/458261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于图像分割的立体匹配方法

1.绪论 立体匹配是三维重建系统的关键步骤&#xff0c;并且作为一种非接触测量方法在工业以及科研领域具有重要的应用价值。为了完成匹配工作以及获取场景的稠密视差图&#xff0c;可以通过构建能量函数对应立体匹配的约束条件。复杂能量函数的全局最优解通常是NP难问题。相对于…

深度相机(二)--结构光深度测距

原文&#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;最为常见的方法是类…

用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…

【立体视觉】双目立体标定与立体校正

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

机器视觉学习笔记(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;也就是其执行期间其…

张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)

from&#xff1a;https://blog.csdn.net/dcrmg/article/details/52939318使用Opencv实现张正友法相机标定之前&#xff0c;有几个问题事先要确认一下&#xff0c;那就是相机为什么需要标定&#xff0c;标定需要的输入和输出分别是哪些&#xff1f;相机标定的目的&#xff1a;获…

opencv双目视觉标定、匹配和测量 (附代码)

from&#xff1a;https://blog.csdn.net/bcj296050240/article/details/52778741双目视觉原理方面参照《学习Opencv》和大牛博客 http://blog.csdn.net/chenyusiyuan/article/details/5970799中16-19系列博客。本文主要记录我自己在双目视觉标定&#xff0c;立体匹配&#xff0…

工业相机的选择方法

信号  工业相机的信号类型有模拟信号和数字信号两种。模拟相机必须有图像采集卡&#xff0c;标准的模拟相机分辨率很低&#xff0c;采集到的是模拟信号&#xff0c;经数字采集卡转换为数字信号进行传输存储。工业数字相机采集到的是数字信号&#xff0c;数字信号不受电噪声影…

socket编程初级

什么是socket定义socket通常也称作套接字&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄&#xff0c;应用程序通常通过套接字向网络发出请求或者应答网络请求。socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”&#xff0c;对于文件…

OpenCV—基本数据结构与示例

OpenCV的基本数据结构及示例OpenCV中强大的Mat类型大家已经比较熟悉了。这里梳理一些在工程中其他经常用到的几种基本数据类型。包括&#xff1a;VecScalarPointSizeRectRotatedRect1. Vec类1.1 基本概念Vec是一个模板类&#xff0c;主要用于存储数值向量。1.2 用法&#xff08…

转载-程序员编程技术迅速提高的终极攻略

2019独角兽企业重金招聘Python工程师标准>>> 前言 你是否觉得自己从学校毕业的时候只做过小玩具一样的程序&#xff1f;走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍&#xff08;朋友的抱怨&#xff1a;学校课程总是从理论出发&#xff0c;作业项目都…

SVM

from&#xff1a;https://blog.csdn.net/liugan528/article/details/79448379 SVM 1. 基本概念 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大。SVM是用来解决二分类问题的有监督学…

LoadRunner常用术语

1.场景 2.负载发生器 3.虚拟用户 4.虚拟用户脚本 5.事务 6.思考时间 7.集合点 8.事务响应时间 转载于:https://www.cnblogs.com/Andy-Lv/p/5263707.html

跟我学Shiro目录贴

2019独角兽企业重金招聘Python工程师标准>>> http://jinnianshilongnian.iteye.com/blog/2018398 转载于:https://my.oschina.net/zhanggongming/blog/714844

【WinForm-无边框窗体】实现Panel移动窗体,没有边框的窗体

没有边框的窗体怎么移动&#xff1f;其实方法有很多&#xff0c;下面介绍一种用控件来移动窗体&#xff0c;Panel或PictureBox都可。主要设置控件的MouseDowm和MouseLeave事件。 第一步&#xff1a;窗体设计 窗体最上面是一个panel1 窗体最下面是一个Panel3&#xff0c;只显示最…

\Grokking Algorithms\简介与作者采访

\关键点\这本书目的是告诉读者解决问题的新方法。 \这本书试图通过插图来让大家更容易掌握主题&#xff0c;避免部分读者觉得太费解。 \这本书不仅适合没有接触过算法的人&#xff0c;也适合刚从计算机专业毕业的学生。 \这本书提供了非常多的例子和简单练习。 \这并不是一本参…