作者:赵磊
博客: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" />
<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} </td>
- <td align="center">${s.index} </td>
- <td align="center">${item} </td>
- </tr>
- </c:forEach>
- </c:if>
<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} </td> <td align="center">${s.index} </td> <td align="center">${item} </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-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>
<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>
<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 |
相关推荐
这些库的组合使用,可以构建一个功能强大的Java Web应用,通过SpringMVC处理请求,Struts(尤其是Struts2)提供额外的MVC功能,MyBatis作为数据访问层处理数据库操作,而JUnit则帮助进行单元测试,确保整个系统的...
3. **测试**:Spring MVC更容易进行单元测试,因为Controller通常是无状态的,而Struts2的Action有状态,测试相对复杂。 4. **社区支持**:虽然两者都有活跃的社区,但Spring MVC由于Spring框架的广泛使用,社区支持...
Struts2、JSF(JavaServer Faces)和SpringMVC都是Java Web开发中非常重要的框架,它们主要用于构建基于MVC(Model-View-Controller)架构的Web应用程序。本快速入门Demo将带你逐步了解这三个框架的基本概念、核心...
1. jsp + servlet + javaben实现springmvc。代码结构清晰,可学习或者重新定制开发。 2. 项目具有详细的开发文档说明,环境配置说明,亲测可运行。 3. 系统说明 3.1 系统介绍 MVC是一种软件架构的思想, 将软件按照...
这个项目的目标是展示如何将传统的Struts框架与Servlet MVC的概念相结合,以构建一个灵活、可扩展的JSP应用程序。这种整合可以利用Struts的强大功能,如Action和Form Bean,以及Servlet MVC的简洁性和灵活性,从而...
在深入学习如Struts2或Spring MVC这样的现代Web框架之前,了解和掌握基础的Servlet、JSP(JavaServer Pages)以及JavaBean技术至关重要。这些技术构成了Web开发的核心基础,对于理解框架的工作原理极其关键。下面将...
Struts的配置文件(struts-config.xml)定义了Action和ActionForm之间的映射,以及转发到哪个JSP页面。 **Hibernate** Hibernate作为ORM框架,解决了Java应用程序与关系型数据库之间的交互问题。它允许开发者使用...
【添加了封面和目录,真正完整版】 本书是系统学习Servlet和JSP的必读之作。由全球知名的Java技术专家(《How Tomcat Works》作者)亲自执笔,不仅全面解读Servlet 和JSP 的最新技术,...第18章介绍Struts 2的用法。
1. 性能上:Struts1 > SpringMVC > Struts2,因为Struts2的拦截器链相比SpringMVC更复杂。 2. 开发效率:SpringMVC和Struts2相似,比Struts1更快。 【核心入口类】 SpringMVC的核心入口类是DispatchServlet;Struts...
Struts的核心是ActionServlet,它是基于Servlet的控制器。 1. **设计模式**:Struts基于Model-2的MVC模式,强调控制器(Action)作为用户请求的入口,通过ActionForm将数据传递到模型(Business Logic)。 2. **...
- **非Servlet API依赖**:Struts2的Action类无需直接依赖Servlet API,这大大降低了框架与底层容器的耦合度,增强了可移植性和可测试性。 #### 二、Struts2与Struts1的关键区别 1. **实例管理**:Struts1中Action...
- **性能对比**:由于 SpringMVC 的单例模式和更轻量的设计,理论上其性能优于 Struts2。 #### SpringMVC 执行流程 SpringMVC 的执行流程如下: 1. **请求处理**:用户发起 HTTP 请求至 DispatcherServlet。 2. **...
- **入口差异**: SpringMVC的入口是一个Servlet(前端控制器),而Struts2的入口是一个Filter。 - **开发模式**: SpringMVC基于方法开发,每个URL对应一个方法;而Struts2基于类开发,每个URL对应一个类。 - **参数...
- **性能对比**:由于Struts2每次请求都需要创建新的Action实例,因此其性能通常不如SpringMVC。 - **参数传递**:SpringMVC支持更加灵活的参数传递方式,可以通过注解(如`@RequestParam`、`@PathVariable`等)来...
在Java Web开发中,Spring MVC和Struts2都是流行的MVC框架,用于构建高效、可维护的Web应用程序。本文将详细讲解如何利用这两个框架实现图片的上传与下载功能。 首先,我们来了解一下Spring MVC和Struts2的基础知识...
- **MVC框架**:Struts2属于MVC(Model-View-Controller)框架,这类框架主要包括Struts、WebWork、SpringMVC等。 - **事件驱动框架**:如JSF(JavaServer Faces)、Tapestry等。 - **Struts2的历史背景**: - *...
在Struts2中,JSP页面通常用作视图,用于渲染和展示结果。 3. **控制器(Controller)**: 控制器接收用户的输入,解析这些输入,并调用相应的模型方法。然后,控制器根据模型的响应更新视图。在Struts2框架中,...
#### 二、SpringMVC与Struts2对比 **2.1 Struts2的不足** - **安全性问题**:存在已知的安全漏洞。 - **性能较低**:处理请求的速度慢于SpringMVC。 - **配置繁琐**:需要大量的XML配置文件。 - **重量级**:相比...
- **开发效率**:与性能表现相反,开发效率大致顺序为:Struts2 > SpringMVC > Struts1 > JSP + Servlet。 #### 四、基于Spring 3.2的Annotation方式搭建SpringMVC环境 1. **下载SpringMVC库** - 从官方网址下载...
4. **性能**:一般认为SpringMVC在性能上优于Struts2,尤其是在高并发环境下表现更佳。 #### 七、SpringMVC高级应用 除了基础应用外,SpringMVC还支持更多的高级特性,例如: - **参数绑定**:支持绑定复杂的对象...