`
mlw2000
  • 浏览: 37357 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用测试来对比分析struts与springMVC的性能

阅读更多

1 前言

    这篇帖子应该发布在一个月前,因为iteye的发帖机制调整,问答积分的限制把俺堵在了大门外。
    写这篇文章是因为个人一直存在一些疑问:
    a. struts的性能到底怎么样?
    b. springMVC相比struts高多少?
    我这个人呢,有个缺点————总是要看到数据才甘心。可能是专家们被忽悠太多次,以至于心里有阴影了,嘿嘿。

 

2 测试准备

    2.1 测试工具:apache ab(简单实用,load runner就不搞了)
    2.1 系统环境:OS: Red Hat EL 5(64bit),  CPU: Intel Xeon E5310 1.60GHz(单颗4核cpu),  Mem: 4G
    2.2 软件环境:Tomcat 6.0.23, jdk 1.6.0_23, Struts2.2.3测试用war包, SpingMVC3.0.5测试用war包。
        2.2.1 tomcat jvm参数仅调整了堆大小为2G:JAVA_OPTS="$JAVA_OPTS -server -Xms2048M -Xmx2048M"
        2.2.2 测试的代码是从url简单传入1个参数,经过mvc的处理后渲染成html页面

 

3 测试过程

    3.1 部署两个war包到同一个tomcat下
    3.2 预热测试,先跑两次测试进行预热,已使结果更稳定
    3.3 通过浏览器请求拿到两个JSESSIONID以备使用,使用包含JSESSIONID的cookie,可以排除每次重新生成session造成的影响。
    3.4 测试并记录结果

 

4 测试结果

    4.1  ab参数 ab -n 10000 -c 10
            RPS每秒处理的请求数     TPR平均响应时间(毫秒)
            struts2.2.3 spring3.0.5     struts2.2.3 spring3.0.5
    第一次 4308     6439         2.321     1.553
    第二次 4150     5873         2.409     1.703
    第三次 3904     6389         2.561     1.565
    平均值 4121     6234         2.430     1.607

    4.2  ab参数 ab -n 10000 -c 10  -C JSESSIONID=XXXXXXXXXX
            RPS每秒处理的请求数     TPR平均响应时间(毫秒)
            struts2.2.3 spring3.0.5     struts2.2.3 spring3.0.5
    第一次 3803     6560         2.629     1.524
    第二次 4221     6965         2.369     1.436
    第三次 4180     6683         2.392     1.496
    平均值 4068     6736         2.463     1.485

 

5 结果分析

    5.1 从TPS上看,sping比struts吞吐量高66%
    5.2 从TPR上看,sping比struts响应速度高40%
    5.3 我们根据TPR和TPS的数据得出如下坚定的结论:“大家尽可能的用spring吧,springMVC比struts快50%以上!”

 

6 个人见解

    我们真的能从测试结果得出“sping比struts吞吐量高66%;响应速度高40%;springMVC比struts快50%以上”的结论吗?
    在整理好结果的第一个小时内,我也是这么认为的,但是我总觉得有不妥之处,以至于后来我推翻了自己之前的想法,原因其实很简单————我们选择了错误的测试用例。
    测试case只需要极其简单的运算,没有其他消耗系统资源的操作(比如db的存取):
    http://127.0.0.1:8080/struts2/example/hello-world.action?name=name
    http://127.0.0.1:8080/spring3/example?name=name
    对于这么简单的运算,struts及sping约等于空转状态,这个测试能得出的结果是”springMVC与struts的空转响应时间是1.5和2.5毫秒“。
    由此得出:如果我们的系统本身的响应时间超出300毫秒,那么采用springMVC与struts的任一个框架,对性能的影响都在1%左右。对于一个不是要求响应在10毫秒以内的系统,采用springMVC或者struts不会有本质的性能区别。

 

7 结束语

欢迎直接指出问题.
ps:拒绝人身攻击(程度较轻可忽略).

 

分享到:
评论
11 楼 skzr.org 2011-06-10  
<div class="quote_title"><br></div>
<p> </p>
<ol>
<li>系统并发上限,不应当被struts2限制住了,因为到系统建设后期很多热点数据都会转移到内存或缓存中,这个时候热点页面的后台逻辑实际上是不耗时间的。</li>
<li>在易用性上spring3 mvc相比struts2来说更加好用。</li>
<li>在RESTful上和ajax中spring3 mvc比struts2更好用。</li>
</ol>
<p><br>我单独测试jsp+el正在我的笔记本上一个table显示最高可以到1.5w/s<br><br>测试时特别注意网络的IO极有可能成为最终瓶颈,使用ajax是不错的选择。<br><br><br>实际上对于高负载的系统,优化到后面,mvc效率对系统并发也有很大的影响。</p>
<p> </p>
<p>最终抛弃struts2是因为使用struts1过来的,后来搞struts2,感觉很多东西都是多余的,再后来解除spring3 mvc就被其简单易用迷住了</p>
<p>套用一句话:谁用谁知道!</p>
<p>struts1经历过7、8个大系统,struts2经历过2个大系统,spring3 mvc目前还没有。</p>
<p>感觉struts2比struts1设计好,不过却没有struts1易用阿,效率上也没有struts1好,很多时候struts2的哪些设计和考虑基本上在开发中都用不上。</p>
<p>后来RESTful和ajax后,spring3 mvc太棒了。</p>
10 楼 downpour 2011-06-09  
mlw2000 写道

skzr.org 写道
实际上你这个分析考察的不再是mvc的性能了,包括了后台的sql执行效率。



第一:
其实我的结论很简单:

“对于一个普通的DELL PC服务器(1.6G hz cpu)来说,采用struts会额外消耗2.5ms的响应时间,采用spring会额外消耗1.5ms的响应时间”。


第二:
这样测试的结果可以作为我们系统技术选型的依据:

假如我们容许3%的性能损失,那么100毫秒以上的业务请求都可以随意使用MVC框架,剩余的关键请求可以采用servlet来处理。


第三:
单单就我测试的硬件环境来看,struts 吞吐量达到4000,spring达到6500;达到这个值的前提是“在action或者controller中几乎完全省略了业务逻辑”。考虑到在95%的情况下,系统的响应时间要求基本上都会超过100毫秒(对于10ms级的应用系统讨论就不需要讨论这个问题了),所以从这个意义上来说,我刚开始的测试可以说是是走入了一个误区,不过弄拙成巧,测试结果反过来从另一个角度解答了我们的疑问。


PS:对于关心servlet性能的同学,我也同期也测试了纯jsp+el表达式的实现,测试吞吐量在7000~8500之间漂移比较大,个人以我那台服务的硬件觉得8000已经是极限了,漂移也比较正常。


个人见解:
关键节点用servlet,其余完全可以MVC,至于选择哪个完全看爱好。



请问什么是关键节点?关键节点就没有业务逻辑了?
9 楼 mlw2000 2011-06-09  
<div class="quote_title">skzr.org 写道</div>
<div class="quote_div">实际上你这个分析考察的不再是mvc的性能了,包括了<span style="color: #ff0000; font-size: small;"><strong>后台的sql</strong></span>执行效率。
<p> </p>
</div>
<p> </p>
<h4>第一:</h4>
<p>其实我的结论很简单:</p>
<p>“对于一个普通的DELL PC服务器(1.6G hz cpu)来说,采用struts会额外消耗2.5ms的响应时间,采用spring会额外消耗1.5ms的响应时间”。</p>
<p> </p>
<h4>第二:</h4>
<p>这样测试的结果可以作为我们系统技术选型的依据:</p>
<p>假如我们容许3%的性能损失,那么100毫秒以上的业务请求都可以随意使用MVC框架,剩余的关键请求可以采用servlet来处理。</p>
<p> </p>
<h4>第三:</h4>
<p>单单就我测试的硬件环境来看,struts 吞吐量达到4000,spring达到6500;达到这个值的前提是“在action或者<span><span class="annotation">controller</span></span>中几乎完全省略了业务逻辑”。考虑到在95%的情况下,系统的响应时间要求基本上都会超过100毫秒(对于10ms级的应用系统讨论就不需要讨论这个问题了),所以从这个意义上来说,我刚开始的测试可以说是是走入了一个误区,不过弄拙成巧,测试结果反过来从另一个角度解答了我们的疑问。</p>
<p> </p>
<p>PS:对于关心servlet性能的同学,我也同期也测试了纯jsp+el表达式的实现,测试吞吐量在7000~8500之间漂移比较大,个人以我那台服务的硬件觉得8000已经是极限了,漂移也比较正常。</p>
<p> </p>
<h4>个人见解:</h4>
<p>关键节点用servlet,其余完全可以MVC,至于选择哪个完全看爱好。</p>
8 楼 itstarting 2011-06-09  
楼主的冷静期分析的不错,否则很多人又要被忽悠一次,还不知道为什么被忽悠的,所以还是欣赏你的审慎

我个人是用Spring mvc的,简单好用。

不过这种框架裸奔性质的测试意义不大,MVC需要考虑的东西还很多,比如表单绑定/转换、校验、VIEW端的“合理”支持、国际化、页面流、RESTFUL……我是数不完,但真的得面对

你不信你测试一下,裸的servlet加上简单的包装,性能可能比这些都好——毕竟spring、struts也必须站在servlet的肩膀上,而servlet又常常是线程不安全的
7 楼 kingkan 2011-06-09  
downpour 写道
lnaigg 写道
如果没有高并发的场景,MVC的性能对整个系统影响应该是比较小的。

随着并发量增长,MVC的效率要求会有所提高,但不会是重点。

个人认为,性能瓶颈有90%都出在持久层。

MVC的选型一般会从架构方面、团队认可度方面考虑,不会从性能方面考虑。


所以楼主的分析是完全正确的。

我不知道为什么大家一直在纠结一个MVC框架的性能而不是它的可用度?我们引入一个框架的最终目的是什么?牺牲了哪些又得到了哪些好处?先明确这个问题,再来考虑这些不搭边的因素。


嗯,同感。看应用场景的侧重点在什么地方,分好轻重,再选择最适合的解决策略,而不是一味的投入那些框架。
6 楼 downpour 2011-06-09  
lnaigg 写道
如果没有高并发的场景,MVC的性能对整个系统影响应该是比较小的。

随着并发量增长,MVC的效率要求会有所提高,但不会是重点。

个人认为,性能瓶颈有90%都出在持久层。

MVC的选型一般会从架构方面、团队认可度方面考虑,不会从性能方面考虑。


所以楼主的分析是完全正确的。

我不知道为什么大家一直在纠结一个MVC框架的性能而不是它的可用度?我们引入一个框架的最终目的是什么?牺牲了哪些又得到了哪些好处?先明确这个问题,再来考虑这些不搭边的因素。
5 楼 lnaigg 2011-06-09  
如果没有高并发的场景,MVC的性能对整个系统影响应该是比较小的。

随着并发量增长,MVC的效率要求会有所提高,但不会是重点。

个人认为,性能瓶颈有90%都出在持久层。

MVC的选型一般会从架构方面、团队认可度方面考虑,不会从性能方面考虑。
4 楼 hardPass 2011-06-09  
楼主,你要不要加上纯servlet的测试?
或者再加上Struts1,struts1会不会比struts2更快点?



3 楼 downpour 2011-06-09  
引用

需求:

1. 服务器连接的需求:


写道
一个实际场景:一个城市缴费系统,大约有146个营业厅,每个营业厅大约3台缴费机。实际上还有其他人也会通过这个系统查询数据。
系统要求,页面响应非查询类<500ms,查询类<3s.
缴费时,可能发生集中缴费,如月中,某个休息日或中午。
假设,每个营业厅同时有2台机器在访问系统,那么就是146个访问,按照1个页面需要连接服务器20次计算,大约1s请求=146*2*20=5840

    从这里看到struts2的提升空间不大。如果是单台tomcat+sturts2,在忙时基本无法满足需求了。

    这时struts2大大限制了系统能承载的请求上限。



2. 优化——说白了就是不断减少页面的响应时间,从而提高并发

  a. mvc页面:因为后台操作一般可能需要耗时300ms,而采用spring mvc带来性能的提升仅仅只有几个ms,这个只能说明mvc部分的优化重点是后台操作

      优化: 页面静态化、页面缓存、后台数据缓存,等等可以把时间大大缩减到100ms以内

  b. 静态连接:显示一个mvc页面往往需要10\20个静态连接支持,这些虽然时间很短基本上都是10ms以内,胜在数量众多。

      优化:多台服务器去承载

      实际上分析iteye发现,主页和静态资源哪怕是图片等使用了304的都基本在100ms左右响应的.



想象下如果我们做的系统所有数据都在内存中,那么对于这样的系统struts2 mvc将会极大的阻碍系统并发上限,当然我们可以认为jsp的上限并发我们是无法达到的。



对于你这种莫名奇妙的分析和莫名奇妙的得出结论,实在是真的懒得反驳。
2 楼 amwiacel 2011-06-09  
我承认结果,但我还是会用strust2
1 楼 skzr.org 2011-06-09  
<p>我的一个理由,见文章:<span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 16px; font-weight: bold; line-height: 24px;"><a style="color: #108ac6; text-decoration: underline;" href="http://skzr-org.iteye.com/blog/1037384">以下是我总结的为什么选择spring?</a></span></p>
<p><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 18px;">
</span></p>
<p>我的机器配置:core2 P8400; 4G mem; ubuntu 10.10 64bit; jvm: -server -Xmx768M; tomcat: 7.02, 最大10线程</p>
<p>测试mvc也就是只测试单纯的controller跳转到view。结果struts2 mvc不到2K/s,spring3 mvc可以到5、6K/s</p>
<p><span style="color: #ff0000; font-size: small;"><strong>和你的测试结论应当说差不多</strong></span></p>
<p> </p>
<p> </p>
<div class="quote_title">mlw2000 写道</div>
<div class="quote_div">6 个人见解<br><br>    我们真的能从测试结果得出“sping比struts吞吐量高66%;响应速度高40%;springMVC比struts快50%以上”的结论吗?<br>    在整理好结果的第一个小时内,我也是这么认为的,但是我总觉得有不妥之处,以至于后来我推翻了自己之前的想法,原因其实很简单————我们选择了错误的测试用例。<br>    测试case只需要极其简单的运算,没有其他消耗系统资源的操作(比如db的存取):<br>    http://127.0.0.1:8080/struts2/example/hello-world.action?name=name<br>    http://127.0.0.1:8080/spring3/example?name=name<br>    对于这么简单的运算,struts及sping约等于空转状态,这个测试能得出的结果是”springMVC与struts的空转响应时间是1.5和2.5毫秒“。<br>    由此得出:如果我们的系统本身的响应时间超出300毫秒,那么采用springMVC与struts的任一个框架,对性能的影响都在1%左右。对于一个不是要求响应在10毫秒以内的系统,采用springMVC或者struts不会有本质的性能区别。</div>
<p> </p>
<p> 实际上你这个分析考察的不再是mvc的性能了,包括了<span style="color: #ff0000; font-size: small;"><strong>后台的sql</strong></span>执行效率。</p>
<p>我们打开iteye.com看看他的实际请求:</p>
<p><br><img src="http://dl.iteye.com/upload/attachment/495502/b849d6db-f8fc-3ca5-b4e0-dcbf47a5bf08.jpg" alt=""></p>
<p>一般一个页面在浏览器中显示是需要很多服务器资源支持的,如上:大约需要25个服务器连接才能完整的显示一个页面</p>
<p>显示页面的请求归类:</p>
<p>1. 动态页 mvc部分</p>
<p>2. 静态资源,哪怕是利用了客户端缓存也必然会存在一个304的连接用于判断资源是否发生更改。</p>
<p>无论是静态还是动态都会占用服务器连接的。</p>
<p> </p>
<p>需求:</p>
<p>1. 服务器连接的需求:</p>
<p> </p>
<div class="quote_title"> 写道</div>
<div class="quote_div">一个实际场景:一个城市缴费系统,大约有146个营业厅,每个营业厅大约3台缴费机。实际上还有其他人也会通过这个系统查询数据。<br>系统要求,页面响应非查询类&lt;500ms,查询类&lt;3s.<br>缴费时,可能发生集中缴费,如月中,某个休息日或中午。<br>假设,每个营业厅同时有2台机器在访问系统,那么就是146个访问,按照1个页面需要连接服务器20次计算,大约1s请求=146*2*20=5840</div>
<p>    从这里看到struts2的<strong>提升空间不大</strong>。如果是单台tomcat+sturts2,在忙时基本无法满足需求了。</p>
<p><strong>    这时struts2大大限制了系统能承载的请求上限。</strong></p>
<p> </p>
<p> 2. 优化——说白了就是不断减少页面的响应时间,从而提高并发</p>
<p>  a. mvc页面:因为后台操作一般可能需要耗时300ms,而采用spring mvc带来性能的提升仅仅只有<strong style="color: #ff0000;">几个ms</strong>,这个只能说明mvc部分的优化重点是后台操作</p>
<p>      优化: 页面静态化、页面缓存、后台数据缓存,等等可以把时间大大缩减到100ms以内</p>
<p>  b. 静态连接:显示一个mvc页面往往需要10\20个静态连接支持,这些虽然时间很短基本上都是10ms以内,胜在数量众多。</p>
<p>      优化:多台服务器去承载</p>
<p>      实际上分析iteye发现,主页和静态资源哪怕是图片等使用了304的都基本在100ms左右响应的.</p>
<p> </p>
<p>想象下如果我们做的系统所有数据都在内存中,那么对于这样的系统struts2 mvc将会极大的阻碍系统并发上限,当然我们可以认为jsp的上限并发我们是无法达到的。</p>
<p> </p>

相关推荐

    struts1原理,struts2原理,spring mvc原理,struts1和struts2,struts和spring mvc

    Struts1强调使用Form Bean来封装请求参数,通过ActionForm与Action之间传递数据,实现了表现层和业务层的分离。 **Struts2原理:** Struts2是在Struts1的基础上发展起来的,它融合了WebWork框架的许多特性。Struts2...

    springMVC使用文档

    - **性能对比**:由于 SpringMVC 的单例模式和更轻量的设计,理论上其性能优于 Struts2。 #### SpringMVC 执行流程 SpringMVC 的执行流程如下: 1. **请求处理**:用户发起 HTTP 请求至 DispatcherServlet。 2. **...

    SpringMVC快速入门 深入分析

    性能优秀:** SpringMVC的设计理念使得开发者能够轻松编写出高性能的应用程序,这一点在与Struts2的对比中尤为明显。Struts2虽然功能丰富,但由于其复杂的架构(如值栈、OGNL表达式、标签库等)可能会导致性能下降...

    SpringMVC快速入门教程-深入分析

    四、Spring MVC与Struts2对比 尽管Struts2是一个成熟的框架,但Spring MVC因其简单易学、高性能和灵活性成为许多开发团队的选择。Spring MVC的注解配置减少了XML配置的复杂性,而Struts2的值栈和OGNL可能导致性能...

    SpringMVC与hibernate整合12实例

    11. SpringMVC与Struts2对比:分析两种MVC框架的优缺点,理解其工作原理差异。 12. 性能优化:探讨缓存机制,如二级缓存的使用,提高系统性能。 以上实例涵盖了SpringMVC和Hibernate整合的各个方面,对于初学者和...

    springMVC 教程

    作者推荐了SpringMVC作为当前最优秀的MVC框架之一,并与Struts2进行了比较分析,认为SpringMVC在性能上超越了Struts2,并且在易用性和灵活性方面具有明显的优势。 接下来,教程中的核心类与接口部分将介绍SpringMVC...

    springMVC基本理论

    - **Struts vs SpringMVC**:虽然两者都是基于MVC模式的Web框架,但是SpringMVC在配置灵活性、性能优化等方面具有明显优势。SpringMVC更加强调约定优于配置的原则,使得开发效率更高。 - **Spring vs SpringMVC**:...

    SpringMVC.docx

    ### SpringMVC详解 #### 一、SpringMVC概述 **SpringMVC**是Spring框架的一个模块,...通过对SpringMVC底层架构、工作流程及与其他框架的比较分析,我们可以更好地理解其优势所在,并在实际项目中灵活运用这些知识。

    struts2学习笔记

    - **JSP与ASP对比**:JSP本质上是编译后的Servlet,而ASP使用的是未编译的脚本语言,两者在运行效率和安全性上有显著差异。 **Model1与Model2**: - **Model1**:JSP充当了View和Controller的角色,适用于简单的...

    struts帮助文档doc-txt-ppt文档(个人总结,绝对一手好资料).rar

    Struts 是一个开源的Java Web框架,由Apache软件基金会维护,它主要被用来构建基于MVC(Model-View-Controller)设计...同时,了解Struts与其他框架(如Spring MVC)的比较,也有助于我们选择最适合项目的解决方案。

    Spring MVC配置文档及原理介绍

    在运行性能方面,JSP+Servlet组合的性能通常最高,其次是Struts 1,接着是Spring MVC,而Struts 2的性能相对较低,特别是当使用OGNL和值栈时。然而,在开发效率上,这些框架的表现却与性能表现相反,Spring MVC和...

    spring面试题分析

    #### 七、SpringMVC与Struts2的比较 1. **入口差异**:SpringMVC的入口是Servlet,而Struts2是Filter。 2. **性能差异**:SpringMVC通常比Struts2稍快一些,因为SpringMVC是基于方法的设计,而Struts2是基于类的...

    Spring MVC 教程,快速入门,深入分析

    Spring MVC是基于Java的开源MVC框架,它用于简化Web应用开发,是Spring框架的一部分。...本文作者赵磊还撰写了一篇比较Spring MVC与Struts 2以及Servlet的文章,感兴趣的话可以参考其中关于性能对比的测试结果。

    Spring_MVC_教程_快速入门_深入分析

    此外,通过比较Spring MVC与Struts2、Servlet等其他MVC框架,本教程也强调了选择Spring MVC的理由,例如学习成本低、性能优秀、扩展性好等。通过了解这些知识点,开发者可以更有效地利用Spring MVC进行Web开发,提升...

    beetl1.26.04-guide.pdf

    Beetl的附录部分列出了函数、格式化函数、标签、与Freemarker的功能对比以及性能比较等信息。 Beetl的扩展包功能强大,可以自定义函数和格式化函数,以及使用标签等。Beetl还提供了宏支持和空格处理方法。 Beetl的...

    基于SSM的高校校园点餐系统源码.zip

    4. **SSH(Struts2+Spring+Hibernate)与SSM的比较**:SSH是早期的Java Web开发框架组合,其中Struts2负责控制流程,Spring提供DI和AOP,Hibernate处理ORM。而SSM则用SpringMVC替代了Struts2,更轻量级且易于配置,...

    spring mvc学习

    - 一般来说,开发效率与性能成反比,Spring MVC 和 Struts2 在开发效率上相当。 #### 基于 Spring 2.5 的 XML 配置项目实践 **项目搭建步骤**: 1. **建立 Web 项目**:首先在开发环境中新建一个 Web 项目。 2. *...

    JavaEE技术问题汇总.docx

    【Struts2与SpringMVC对比】 Struts2是基于Action的MVC框架,配置相对繁琐。SpringMVC是Spring的一部分,依赖注入强大,配置简洁,性能较好。 【SpringMVC核心组件与运行流程】 核心组件包括DispatcherServlet、...

    Beetl 模版引擎

    它支持多种web框架的整合,如SpringMVC、JFinal、Struts、Nutz、Jodd和Servlet等,并能够单独开发和测试模板,无需M和C部分的参与。Beetl也支持自定义方法、格式化函数、虚拟属性、标签和HTML标签,并允许自定义占位...

    完全基于注解方式SSH框架项目设计.pdf

    在Hibernate框架中,可以通过@Entity、@Table、@Column等注解来定义实体类以及其与数据库表的映射关系,使用@NaturalId等注解来指定自然主键等。 采用完全注解方式的SSH框架项目设计,需要程序员具备较高的Java基础...

Global site tag (gtag.js) - Google Analytics