`
mlw2000
  • 浏览: 36557 次
  • 性别: 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:拒绝人身攻击(程度较轻可忽略).

 

分享到:
评论
31 楼 aiou 2013-06-28  
为什么你测试的springmvc吞吐量达到这么高,我的机器配置比你的好多了,但是只到500/s
jsp能到13000/s,
求教!
30 楼 husituo 2012-06-18  
嗯说的不错,谢谢你。我相信你了,我不去测试了。呵呵
(关键是我不会测试,有空学一下去。)
29 楼 magicgrass 2011-06-10  
试着回复下
28 楼 skzr.org 2011-06-10  
<div class="quote_title">idle_sun 写道</div>
<div class="quote_div"> "spring 生态"的活跃程度太高了。。 我也是spring的狂热者, 只不过以前对spring mvc印象不是很好, 抽空去看看spring3mvc(spring mvc居然有那么多粉丝了)....</div>
<p> </p>
<p> </p>
<ul>
<li>曾经我也是用了struts1后准备使用spring mvc(08年左右),不过那个时候spring mvc太复杂,并且不好维护,看到struts2,就转移到struts2上去了。使用struts2大约有3年经验,感觉过度灵活了,绝大多数的灵活性实际上整个项目中都用不上的。<br><br>
</li>
<li>去年6月份,开始重新接触spring3的mvc,看了其showcase后,深深迷恋了,这个就是我需要的,仅此而已。<br><br>
</li>
<li>当时也抉择:struts2已经开发一些interceptor,现在到spring中,还需要重新设计。尝试按照spring的方式思考问题,对比struts2的方式,感觉spring的方式更加合适设计——所以一直在使用spring3 mvc。</li>
</ul>
<p> </p>
<p> </p>
<div style="font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff; margin: 8px;">
<div class="quote_title" style="font-size: 12px; color: #000000; font-weight: bold; margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; padding: 5px;">wuzaizhong283 写道</div>
<div class="quote_div" style="font-size: 12px; color: #000000; margin-top: 0px; margin-right: 5px; margin-bottom: 5px; margin-left: 15px; background-color: #fafafa; padding: 3px; border: 1px solid #cccccc;">麻烦你把struts2的default  interceptor stack 中不必要的 interceptor 去掉几个,就有好一点的结果了,难道你做系统是不调整的吗,这真用的时候有些interceptor可以合并的,有的可以去掉的。</div>
<p style="margin: 0px;">我测试的时候是使用struts2,<span style="color: #ff0000; font-size: small;"><strong>关闭struts2的开发模式</strong></span>,配置一个<span style="font-size: 12px; color: #ff0000;"><strong>空的缺省interceptor栈</strong></span>。</p>
<p style="font-size: 12px; color: #000000; margin: 0px;"> </p>
<p style="margin: 0px;"> </p>
<div class="quote_title" style="font-size: 12px; color: #000000; font-weight: bold; margin-top: 5px; margin-right: 0px; margin-bottom: 0px; margin-left: 15px; padding: 5px;">Reset 写道</div>
<div class="quote_div" style="font-size: 12px; color: #000000; margin-top: 0px; margin-right: 5px; margin-bottom: 5px; margin-left: 15px; background-color: #fafafa; padding: 3px; border: 1px solid #cccccc;">Struts2 需要每次都new Action</div>
<div style="font-size: 12px; color: #000000;">这个影响不是很大,就像楼主分析的对于网站整体来说,可能也就影响&lt;1%。除非你的网站访问量非常高,1%的影响也将变得可观。</div>
<div style="font-size: 12px; color: #000000;"><br></div>
<div><span style="color: #ff0000; font-size: small;"><strong>量没有到一定程度,很多问题都不是问题,如果量超过了一定的度,小问题可能都会编程大问题,量变到质变</strong></span></div>
</div>
27 楼 wuzaizhong283 2011-06-10  
麻烦你把struts2的default  interceptor stack 中不必要的 interceptor 去掉几个,就有好一点的结果了,难道你做系统是不调整的吗,这真用的时候有些interceptor可以合并的,有的可以去掉的。
26 楼 Reset 2011-06-10  
Struts2 需要每次都new Action
25 楼 mlw2000 2011-06-10  
我用struts2的方式:弃用struts标签,使用freemarker result生成html、xml,使用json result生成json;
因为吞吐量2000对我来说足够了,
我一直有个疑问想问下roobin,“对于非静态页面,iteye的访问高峰期吞吐量能不能达到2000”?
24 楼 idle_sun 2011-06-10  
"spring 生态"的活跃程度太高了。。 我也是spring的狂热者, 只不过以前对spring mvc印象不是很好, 抽空去看看spring3mvc(spring mvc居然有那么多粉丝了)....
23 楼 idle_sun 2011-06-10  
supben 写道
idle_sun 写道
supben 写道
result里面还支持freemarker呢,10几种!但是一般的项目用的着么?
我的意思就是struts太庞大了啊。

struts tag不用,model-driven不用,validation不用,试问这不就是spring mvc么?


就像spring被抱怨庞大一样,spring的发展注定会集成多的jee技术,一样有老多人在那抱怨什么越来越像ejb, 但是别人spring的模块层次清析,各个部分独立。 集成这么多东西只能说明设计合理扩展性好。  这个道理同样适用于struts2

(ps:反正struts tag不用,有jquery  validation导是非常方便


关键是struts 里面绝大部分工作都被其他更好的代替了,和spring还是不同吧。


可能我落后了,如果真的“大部份工作”都被spring更好的代替的话, 那倒是。

不过我一直欣赏struts2的设计,设计非常棒。  在良好的设计下(扩展性强), “大部份工作”都已经比不上spring了, 只能说struts2社区已经不活跃,没有人提供更好的实现了。
22 楼 supben 2011-06-10  
idle_sun 写道
supben 写道
struts和页面绑定的太多了。
比如数据验证啊,ognl绑定啊。原来解决了很多问题。
但是现在不需要了,jquery,ajax这些东西的存在,比他更方便,效果更好。现在要求的controller仅仅是需要返回一个文件流而已(jsp/json/xml)!

当然,如果你的系统完全是增删改查之间的跳转,那struts2 实在是太方便了。
否则 绝对是spring mvc更好。

struts2扩展性非常好,你说的这些完全可以实现(一个result而以)

而且页面绑定也不是struts最大的亮点,个人一直觉得没大用处,页面有jquery



哥们交个朋友呗,我Q 409123969
21 楼 supben 2011-06-10  
idle_sun 写道
supben 写道
result里面还支持freemarker呢,10几种!但是一般的项目用的着么?
我的意思就是struts太庞大了啊。

struts tag不用,model-driven不用,validation不用,试问这不就是spring mvc么?


就像spring被抱怨庞大一样,spring的发展注定会集成多的jee技术,一样有老多人在那抱怨什么越来越像ejb, 但是别人spring的模块层次清析,各个部分独立。 集成这么多东西只能说明设计合理扩展性好。  这个道理同样适用于struts2

(ps:反正struts tag不用,有jquery  validation导是非常方便


关键是struts 里面绝大部分工作都被其他更好的代替了,和spring还是不同吧。
20 楼 rustlingwind 2011-06-10  
测试之前请将  struts2 的默认拦截器配置修改一下,很多没必要使用的拦截器可以去掉,能提高不少性能。
19 楼 idle_sun 2011-06-10  
supben 写道
result里面还支持freemarker呢,10几种!但是一般的项目用的着么?
我的意思就是struts太庞大了啊。

struts tag不用,model-driven不用,validation不用,试问这不就是spring mvc么?


就像spring被抱怨庞大一样,spring的发展注定会集成多的jee技术,一样有老多人在那抱怨什么越来越像ejb, 但是别人spring的模块层次清析,各个部分独立。 集成这么多东西只能说明设计合理扩展性好。  这个道理同样适用于struts2

(ps:反正struts tag不用,有jquery。  struts2 validation导是非常方便,另外 js在前端做了验证,  不是说服务器端就不用验证。
18 楼 supben 2011-06-10  
这就比如ext和jquery,你ext用就用他整个的。
如果你仅仅是1-2个页面需要那种效果,其他部分仍然是传统的。
那还是该用ext还是jquery呢。
17 楼 supben 2011-06-10  
result里面还支持freemarker呢,10几种!但是一般的项目用的着么?
我的意思就是struts太庞大了啊。

struts tag不用,model-driven不用,validation不用,试问这不就是spring mvc么?
16 楼 idle_sun 2011-06-10  
supben 写道
struts和页面绑定的太多了。
比如数据验证啊,ognl绑定啊。原来解决了很多问题。
但是现在不需要了,jquery,ajax这些东西的存在,比他更方便,效果更好。现在要求的controller仅仅是需要返回一个文件流而已(jsp/json/xml)!

当然,如果你的系统完全是增删改查之间的跳转,那struts2 实在是太方便了。
否则 绝对是spring mvc更好。

struts2扩展性非常好,你说的这些完全可以实现(一个result而以)

而且页面绑定也不是struts最大的亮点,个人一直觉得没大用处,页面有jquery
15 楼 idle_sun 2011-06-10  
异常处理,权限验证,接口日志.......

intercepter真爽,粒度比filter小得多。 \("o")/
14 楼 supben 2011-06-10  
struts和页面绑定的太多了。
比如数据验证啊,ognl绑定啊。原来解决了很多问题。
但是现在不需要了,jquery,ajax这些东西的存在,比他更方便,效果更好。现在要求的controller仅仅是需要返回一个文件流而已(jsp/json/xml)!

当然,如果你的系统完全是增删改查之间的跳转,那struts2 实在是太方便了。
否则 绝对是spring mvc更好。
13 楼 nighty 2011-06-10  
downpour 写道
lnaigg 写道
如果没有高并发的场景,MVC的性能对整个系统影响应该是比较小的。

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

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

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


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

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


非常赞同,一个项目成功与否,程序开发的过程占的时间比例不高。能否减少代码量、是否开发效率高、易维护、用了框架,能在规定期完成项目才是正常的目标。
再好的框架和程序,交付不了,没有客户,全是浮云!
12 楼 idle_sun 2011-06-10  
<p>首先我承认struts2的性能肯定比不过spring(因为intercepter和prototype).</p>
<p> </p>
<p>但是就我做的项目来说,没有一个项目会在mvc存在瓶颈</p>
<p><span style="color: #888888;"><em>(如果在你的系统中 action 已经是最耗时的一层了 -.-!!  那就换用spring mvc/struts1/servlet吧)</em></span></p>
<p> </p>
<p>struts2的设计非常好,最喜欢的是  intercepter,扩展性非常强,而且用起来也相当简单。struts2的配置也是亮点, 框架扩展性和易用性是我一直选择strurts2的最大的原因!</p>
<p> </p>
<p>但是刚刚在看贴的时候,看到<span><strong>skzr.org</strong><span>老兄说spring3 mvc比strurts2还更好用?</span></span></p>
<p> </p>
<p><span><span>印象中spring mvc的易用性大大落后于struts2,没有深入用过。 如果在性能、扩展性和易用性都非常好的,我可能会换spring3 mvc,也为了"</span></span><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; line-height: 15px;">spring生态"(一直认为"spring生态"中,mvc是最差的一环,所以没有用)</span></p>
<p> </p>
<p>总之,先看看spring mvc再说吧.. 如果是真的话....</p>

相关推荐

Global site tag (gtag.js) - Google Analytics