`

Struts2、SpringMVC、Servlet(Jsp)性能对比 测试

阅读更多

作者:赵磊

博客:http://elf8848.iteye.com

 

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中如下

<Connector port="8080" maxHttpHeaderSize="8192" 
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
enableLookups="false" redirectPort="8443" acceptCount="100" 
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标签性能还是不错的。

<c:if test="${empty list}"> 
<tr> 
<td align="center">无记录!</td> 
</tr> 
</c:if> 
<c:if test="${not empty list}"> 
<tr> 
<th>从 1 开始的迭代计数</th> 
<th>从 0 开始的迭代计数</th> 
<th>产品名称</th> 
</tr> 
<c:forEach items="${list}" var="item" varStatus="s"> 
<tr bgcolor=${s.index%2==0?"#E2E2E2":""}> 
<td align="center">${s.count}&nbsp;</td> 
<td align="center">${s.index}&nbsp;</td> 
<td align="center">${item}&nbsp;</td> 
</tr> 
</c:forEach> 
</c:if> 

 
测试7: 访问一张图片(srping方式一)   1997个请求/秒
100并发,循环100次,共10000个请求. 因为我使用了spring3 MVC,拦截/,所以图片不能访问,所以添加了:

<servlet-mapping>      
    <servlet-name>default</servlet-name>      
    <url-pattern>*.jpg</url-pattern>      
</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标签,如下:

<s:property value="message"/> 
<s:url id="url" action="HelloWorld"> 
     <s:param name="request_locale">en</s:param> 
</s:url> 
<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标签 ,测试结果如下图:

使用的标签是:

<s:form action="Login"> 
    <s:textfield key="username"/> 
    <s:password key="password" /> 
    <s:submit/> 
</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




 

 

  • 大小: 17 KB
  • 大小: 19.6 KB
  • 大小: 19.9 KB
  • 大小: 19.5 KB
  • 大小: 20.9 KB
  • 大小: 21.3 KB
  • 大小: 20.7 KB
  • 大小: 18.1 KB
  • 大小: 18 KB
  • 大小: 18 KB
  • 大小: 18.9 KB
  • 大小: 19.1 KB
  • 大小: 71.8 KB
  • 大小: 18.4 KB
  • 大小: 18.3 KB
  • 大小: 20.4 KB
分享到:
评论
18 楼 zhuyijian135757 2015-12-19  
容器是jetty还是tomcat也得考虑下!毕竟不管是struts2 还是spring mvc,原生的servelt,都是应用业务层的性能测试,而应用层的线程模型都是在容器里实现的。
17 楼 jsd_lxf 2015-11-20  
不错
16 楼 hz9804 2014-10-08  
[img][/img][url][/url][flash=200,200][/flash][color=red][/color][size=x-small][/size][align=left][/align]
15 楼 hzgz402 2014-06-05  
llllhttp://tongji.linezing.com/report.html?unit_id=2912463
14 楼 hzgz402 2014-06-05  
[align=center][color=red][/color]
[/align]
12 楼 so_fast 2013-07-30  
学习学习学习
11 楼 aiou 2013-06-27  
为什么你测试springmvc的吞吐量那么高?
我用ab测的
页面内容都是:

<%@ page language="java" contentType ="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
<html>
<head>
<meta http-equiv= "Content-Type" content="text/html; charset=UTF-8">
<title >Insert title here</title>
</head>
<body>
empty jsp
</body>
</ html>

** 并发量 请求数 吞吐量 每请求耗时( ms) 每请求实际运行时间(ms) 最长时间(ms) 总时间(s )

jsp
1000 10000 13305.94 75.154 0.075 131 0.751544

jsp  1000
10000 12205.99 81.972 0.082 76 0.81927

springmvc
1000 10000 477.15 2095.756 2.096 5358 20.957557

springmvc
1000 10000 476.50 2098.651 2.099 2055 2.98651


可见 springmvc使吞吐量下降近30倍
以上测试在4核2.4G CPU、32G内存的服务器上测试,tomcat最大线程数1000,JVM设置内存为2G
而且我用是jmeter测试我工作用的台式机的springmvc的100*100的吞吐量只有169.7

能给我介绍一下为什么你测试的springmvc吞吐量那么高?
10 楼 aiou 2013-06-27  
为什么你测试springmvc的吞吐量那么高?
我用ab测的
页面内容都是:

<%@ page language="java" contentType ="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
<html>
<head>
<meta http-equiv= "Content-Type" content="text/html; charset=UTF-8">
<title >Insert title here</title>
</head>
<body>
empty jsp
</body>
</ html>

并发量 请求数 吞吐量 每请求耗时( ms) 每请求实际运行时间(ms) 最长时间(ms) 总时间(s )jsp 1000 10000 13305.94 75.154 0.075 131 0.751544jsp  1000 10000 12205.99 81.972 0.082 76 0.81927springmvc 1000 10000 477.15 2095.756 2.096 5358 20.957557springmvc 1000 10000 476.50 2098.651 2.099 2055 2.98651


可见 springmvc使吞吐量下降近30倍
以上测试在4核2.4G CPU、32G内存的服务器上测试,tomcat最大线程数1000,JVM设置内存为2G
而且我用是jmeter测试我工作用的台式机的springmvc的100*100的吞吐量只有169.7

能给我介绍一下为什么你测试的springmvc吞吐量那么高?
9 楼 kiaonly 2012-11-30  
嗯 好牛。很好看
8 楼 aubdiy 2012-09-04  
恩,最近正在做 框架选型,看了这篇文章大有启发,自己也测测,实践出真知
7 楼 kjj 2012-08-15  
希望那些常常爱炫耀spring mvc性能优于struts2 的粉们好好看看这片文章!!
6 楼 天涯_海角 2012-03-31  
不错,不错不错
5 楼 lxbjkben 2012-03-08  
“每台服务器每秒处理请求的数量=((80%*总PV量)/(24小时*60分*60秒*40%))/服务器数量”
按照博主提供的计算公式,俺算出来的每秒请求数好像比博主的少一个数量级。。俺是不是算错了。。
4 楼 song_in_china 2012-03-05  
支持、看了 博主的 真正spring mvc入门,确实和是有质量啊。希望博主写书吧。
3 楼 yaoweinan 2012-02-01  
支持 支持
2 楼 Jackie_GP 2011-09-02  
支持,支持,支持
1 楼 guxinghanshe 2010-12-08  
支持,继续跟进

相关推荐

    jsp + servlet + javaben实现springmvc

    1. jsp + servlet + javaben实现springmvc。代码结构清晰,可学习或者重新定制开发。 2. 项目具有详细的开发文档说明,环境配置说明,亲测可运行。 3. 系统说明 3.1 系统介绍 MVC是一种软件架构的思想, 将软件按照...

    JSP+JavaBean+Servlet工程(web)

    当你想学struts2或springmvc框架之前,可以先看看这个web工程,因为Servlet技术是web框架的基础,本工程简单易懂,相信对你的框架学习会有很好的帮助

    Java 企业面试题精选

    java基础 OOP JavaSe 数据库 JDBC xml web基础 servlet和JSP spring mybatis Struts2 springMVC Hibernate

    JSP应用开发详解

    以精简的内容介绍了JSP的语法、Servlet技术、JDBC技术、标签库技术、表达式语言、Struts、JavaServerFace、SpringMVC、Hibernate、Ajax等技术;对于JSP开发中常遇到的典型难点,专门设置了专题进行集中讨论。对于...

    jsp应用开发详解

    以精简的内容介绍了JSP的语法、Servlet技术、JDBC技术、标签库技术、表达式语言、Struts、JavaServerFace、SpringMVC、Hibernate、Ajax等技术;对于JSP开发中常遇到的典型难点,专门设置了专题进行集中讨论。对于...

    java经典框架springmvc+mybatis

    JSP+Servlet,Java Web开发的基础 这方面可以关注Java开发基础专题。 2&gt;服务器: WebLogic的原理、使用和配置 Tomcat:轻量的JavaWeb容器,和WebLogic功能类似,使用简单、方便、免费、开 源,但不支持EJB ...

    达内java培训目录

    Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...

    simplejee-面向j2ee初学者的开源项目

    * 包括jsp,servlet,html,javascript,css等,以及springmvc+jdbcTemplate和 struts2+hibernate+spring, struts2+ibatis+spring 实现的登陆,CRUD,jfreechart图表显示等例子,用来演示两个mvc框架的基本使用,...

    ssh部门员工管理系统,实现部门和员工的增删改查和分页等

    jsp+servlet+javaBean构成的MVC 员工、部门的增删改查、分页等 ssh 开发环境 window7 eclipse: Mars.2 Release (4.5.2)(插件:springsource-tool,hibernatetools-Update) Mysql 5.5.1 Tocat7.0 框架版本 Spring...

    java求职简历

    2. 熟练运用Servlet、Struts、Hibernate、Spring、Springmvc、Mybaits、SSH框架等技术。 3. 熟练运用JavaScript、Css、Jsp、Html、 Ajax、Xml、Jquery、Json等相关技术。 4. 掌握主流的数据库的相关知识,熟练使用...

    简历模板Java工程师.zip

    ◇ 熟练运用struts2、hibernate、spring、springmvc、mybatis、jquery、Ajax、JSTL/EL、WebService、jdbc、dom4j、log4j等技术 ◇ 掌握常用的JAVA设计模式,熟悉软件设计开发流程 ◇ 了解MySql、Oracle等数据库。 ◇ ...

    springmvc和mybatis集成全部jar包(全)

    lib/struts2-core-2.0.11.jar lib/poi-3.11-20141221.jar lib/poi-excelant-3.11-20141221.jar lib/poi-ooxml-3.11-20141221.jar lib/poi-ooxml-schemas-3.11-20141221.jar lib/poi-scratchpad-3.11-20141221....

    xiangmu.zip

    web端可以理解为tomcat,并且tomcat中运行着你编写的程序,这个程序称为web应用。 java服务器开发就是通过java语言来编写程序,组合...为了高效还会使用一些框架和技术来配合java程序,比如SpringMVC,struts2,Servlet

    java面试基础知识.docx

    第三部分包括服务器、JSP、JDBC、servlet、filter、listener。第四部分介绍Hibernate。第五部分介绍Struts2。第六部分介绍spring,包括IOC、AOP、事务。第七部分介绍Mybatis。第八部分介绍springmvc,第九部分介绍...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    JAVA开发工程师简历

    熟练使用spring,struts2,hibernate,springmvc,mybatis,springboot等架构的以及各相互间的整合开发(ssh,ssm),配置及对象的设计和开发。 对redis缓存,ActionMQ消息队列有一定的了解使用。 熟练使用jsp、servlet、...

    JavaEE上机实验报告和代码

    实验1(JSP技术及JSP语法基础) 实验2(JavaBean组件程序设计) 实验3(Servlet基础) 实验4(客户请求的处理与服务器响应的生成) 实验5(MVC设计模式) ...实验8(Struts2或SpringMVC框架) 实验9(JavaEE应用实例)

    SpringMVC+Spring+Mybatis三大框架综合练习[MySQL/AJAX/IDEA]

    jsp/servlet---&gt;oracle数据库---&gt;项目讲解---&gt;Mybatis框架----&gt;spring框架----&gt;springmvc框架---&gt;ssm三大框架整合---&gt;maven---&gt;SVN/GIT---&gt;hibernate框架---&gt;struts2框架---&gt;linux...

    非常苛刻的java工作要求

    掌握主流的Java开源框架Struts2、Spring、SpringMVC、Hibernate/Mybatis、iBatis等,最好熟悉Freemaker或volecity。 2. 熟悉中间件Tomcat、jboss、Apache、Weblogic、WAS; 3. 熟悉各种Web前端技术,包括JavaScript...

    javaee笔记

    EL表达式、Filter)、mysql、jdbc、文件上传与下载、Ajax、jQuery、struts2、struts2高级、spring、hibernate、shiro、springmvc、mybatis、webservice、maven、svn、activiti、lucene、linuxPPT

Global site tag (gtag.js) - Google Analytics