`
hypercube1024
  • 浏览: 85251 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2的性能为什么这么差,有性能测试截图

    博客分类:
  • java
阅读更多
最近觉得struts2性能感觉好差,然后就对struts2和springMVC3分别作了以下性能测试,结果太让人吃惊了!
机器配置是 T6600 + 2G内存

执行一条最简单的查询语句,500线程
select * from folder where fid = '1' order by orderNum

struts2 + spring3 + hibernate 的测试结果



struts2 + spring3 + mock对象的测试结果




spring3 MVC + hibernate 的测试结果




最后是spring3 MVC + jdbc 的测试结果



根据最后两种情况可以看到 hibernate 对性能的损失尚可接受,但是struts2的性能为什么和 spring3 MVC 差这么多 -_-b

最后附上struts2官方的helloWorld例子程序的测试结果





性能也不容乐观。。。。。。
这个是官方的helloworld例子使用的jar包如下
<dependencies>

		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.1.8.1</version>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
		</dependency>

	</dependencies>


然后是我的 struts.xml 配置文件,log 也已经设置到 ERROR 级别
<struts>

	<constant name="struts.devMode" value="false" />

	<package name="basicstruts2" extends="struts-default">

        <!-- If no class attribute is specified the framework will assume success and 
        render the result index.jsp -->
        <!-- If no name value for the result node is specified the success value is the default -->
		<action name="index">
			<result>/index.jsp</result>
		</action>
		
		<!-- If the URL is hello.action the call the execute method of class HelloWorldAction.
		If the result returned by the execute method is success render the HelloWorld.jsp -->
		<action name="hello" class="org.apache.struts.helloworld.action.HelloWorldAction" method="execute">
			<result name="success">/HelloWorld.jsp</result>
		</action>

	</package>

</struts>


  • 大小: 11.6 KB
  • 大小: 13.2 KB
  • 大小: 11.6 KB
分享到:
评论
109 楼 yangyi 2011-05-14  
拦截器过滤器之类的一般比较耗性能,正交性的优雅是以性能为代价的。当然性能不是问题,性能瓶颈才是问题
108 楼 iday 2011-05-14  
人家都说了他们的系统对性能要求比较高。
107 楼 簡單從泚銷夨 2011-05-09  
两个我都用过,我感觉SpringMVC比Struts2MVC好用,为什么许多人用StrutsMVC,那是中国人都喜欢跟着别人的后面走,先人都用StrutsMVC,那我们也跟着后面用。
106 楼 fmjsjx 2011-05-09  
    看了这么多回复,发现一个大家都没注意的问题,大家各自的测试都跑了多长时间?都知道JVM对大量访问的对象会有优化,原则上做性能测试前最好先弄个类似压力测试的过程,至少先访问10W次以上,然后再来测试性能。
    struts2性能差点很正常,不过许多应用并不需要考虑性能问题,一个OA系统、CRM系统或其他的什么企业内部系统,一个企业总共才多少人?通常也只有遇到大型系统、考虑大量用户并发访问时再去考虑效率问题。
105 楼 liukai 2011-05-08  
一个框架的性能影响能有多大?

rails的框架性能高吗?
动态语言的性能能和JAVA比吗?

但是很多人都做的项目都做不到ITEye这种流量吧?
ITEYE和twitter都证明了rails至少从框架性能上是过硬的.

框架的性能在我看来从来不是一个项目的是否成功的主要因素.

对于框架的考虑需要从开发效率,扩展性,易用性,人员融入度等方面考虑.
而开发效率是选择框架的首要考虑.

以前我发过一个帖子,分析了国外struts和Spring3MVC的使用情况比较.
得出的结论是现在在国外Spring3MVC的流行度已经超过struts了.
从这点看,Spring3MVC的开发效率是超过struts的.

但是在中国又是另外一种情况.
整个软件氛围和SSH的流行使得Spring3MVC很难融入目前
的主流.

最近在网上的招聘网站搜索了下成都的关于JAVA的职位.
没有一家是需要招聘熟悉SpringMVC的java程序员.绝大多数都是需要熟悉SSH.

学习Spring3MVC需要成本.但很多公司能提供这个时间和人力成本吗?

所以只能靠程序员的自觉.利用闲暇时间自学和研究Spring3MVC.

而且在一个公司只能通过自上而下的方式推广Spring3MVC.
下面的程序员再怎么向team leader推崇Spring3MVC.

TL觉得SSH能解决的问题为什么一定要用Spring3MVC解决?
技术上的问题客户根本不理解或者说不需要了解.他要的只是结果.
乙方尽快完成项目收到钱才是王道.

TL权衡后觉得还是servlet,SSH方便,
该怎么用servlet,struts的都老老实实的继续用吧.


虽然有点偏离楼主的主题.
但我最后总结,框架性能从来不是一个项目的主要考量.
框架之间的性能差异在我看来可以忽略的.
项目组里的技术负责人认为哪个框架开发效率高才是选择哪个框架的主要因素.

104 楼 amwiacel 2011-05-07  
想问一下,我在页面非常大的数据,很多页面都是动态循环得到的html标签,我不用springmvc的标签,请问,我提交时springmvc能像struts2那样方便吗?
PS,如果你用spring,建议用struts2的基础拦截器吧,不要用默认的!
103 楼 dy.f 2011-05-06  
个人觉得性能的瓶颈在连数据库那一块,写的sql也好,hql也好,如果写得不好,性能的差别也是很大的。
比如:一个表有50个字段,这个表存了几百万条记录,其实你只用这个表其中几个字段,如果写成“select a from ModelName a”,获得a对象之后再get需要的字段,这样会很耗性能的,最好写成“select a.xxxx,a.yyyyy,a.zzzz from ModelName a”,另外最好在数据库表里对这些常查询的字段建索引,这样性能会好恨多。
所以,我的意见是,struts也好,springmvc也好,它们的性能对于客户来说,都是可以接受的。
102 楼 同学、木 2011-05-01  
真的是这样的?那为什么还有那么多人用STRUTS2
101 楼 hubeen 2011-04-06  
struts2的目的是为了降低耦合,方便开发,维护简单,并没有把主要精力放在性能上。你说action/request、参数检查注入、ognl、N多拦截栈来回倒腾能快吗?什么东西合适就行,要方便请找struts,要高性能请使用cgi。
100 楼 archerboy 2011-04-04  
kgd1120 写道
本人觉得struts2性能差是正常的,因为struts2的Action对象是Prototype类型的,而且分离Servelt API时大量的用到Java的反射机制,Java的发射恰恰又是非常影响性能。


Java的发射恰恰又是非常影响性能,据说jdk1.5后差别不大
99 楼 ancle*f 2011-04-03  
LZ精神赞
不过个人觉得,对于struts2的实验,LZ没有做完
这个简单的例子并不能得出LZ的结论
大胆猜测,严谨结论
98 楼 hc_face 2011-04-03  
楼主这个性能观察器是自己写的java程序吗?可以共享下吗?先谢谢了
97 楼 sinopf 2011-01-09  
好文章,我很喜欢这种较真儿的文章
96 楼 hypercube1024 2010-12-27  
skzr.org 写道
pengzhoushuo 写道
哎,发现很多人都只停留在“用框架”的阶段,楼主测出来了,你们只知道一味的质疑,就不会自己动下手?概括一下质疑类型
1、hibernate影响了struts,请认真看主贴,LZ同时测试了有数据库操作和没数据库操作的情况;
2、什么spring暗地排斥struts呀,不想说了
3、OGNL和plus 什么XX,可以单纯地用各自MVC部分,你会发现struts还是比spring mvc慢
4、有些人说init的时间长,这个有点道理,但测试的时候可以通过“预热”的办法规避。
5、有些说什么这种测试条件不能代表所有情况的呀,典型的睁眼说瞎话。又不想说了。

其实struts2比spring慢很容易解析,这与struts的设计哲学相关,struts的设计者不在乎对象的多少,在乎的是如何与Servlet解耦,每个请求一个Action实例,可以优雅的OO,QueryString中的parameter会被注入到Action中设置的同名的field中。
那struts产生如此之多的短生命对象,我们就不用它了吗?建议大家都去实现一个自己的MVC框架你也同样会遇到这个问题的。
哥当年自己搞了个很简单的MVC,只实现了核心部分-控制跳转,无非根据一个url调用Action里指定的方法,通过分析字符串,可以将Action的名字和方法名都找到,问题是我每个请求都实例化一个Action吗?哥当年没敢这么做,而是在程序一启动的时候就实例化好所有的Action,当请求到来时找到对应的实例再调用它方法,这样做就要求开发人员不用将与本次请求相关的数据放到Action中,就跟Servlet一样,好处是对象少,坏处是要小心谨慎,自己拿捏吧。


每一楼都看了,还是pengzhoushuo说的不错,很多人都是随意意测,如:pengzhoushuo说的1、2、3、4点中已经解释了

貌似大家都浮躁,基本上走马观花的看东西,然后开始下结论了

我的测试结果:
环境:ubuntu desktop 64位,cpu core2 P8400 2.26G, 4G mem
jvm: sun jdk 1.6.0_23 64bit
64位tomcat7:maxThread=10,(运行测试时看到总内存使用了1.4G内存),java_opts=-server
struts2,spring3 mvc,helloworld.jsp(里面只有hello ${message})
用例:
  1. struts2 helloworld.do直接跳转到helloworld.jsp
  2. sprint mvc helloworld跳转到helloworld.jsp
MyEclipse中启动tomcat进行测试:
测试:ab -n 10000 -c 10 多次运行后结论
struts2:低于2000/s
spring3 mvc:4600->6000/s
直接访问jsp : 5000->7000/s

所以现在在突击spring3 mvc,学习下


那些开源的框架都是大而全,太多功能其实都用不上,比如国际化、支持多种视图、和其他框架的整合等等,导致响应速度缓慢,现在我自己写了一个mvc框架,很轻量,比struts,springMVC什么的性能好些,性能和纯Servlet差不多吧,使用上就和spring3MVC差不多,也是基于annotation和RestURL的 ^_^
95 楼 skzr.org 2010-12-26  
pengzhoushuo 写道
哎,发现很多人都只停留在“用框架”的阶段,楼主测出来了,你们只知道一味的质疑,就不会自己动下手?概括一下质疑类型
1、hibernate影响了struts,请认真看主贴,LZ同时测试了有数据库操作和没数据库操作的情况;
2、什么spring暗地排斥struts呀,不想说了
3、OGNL和plus 什么XX,可以单纯地用各自MVC部分,你会发现struts还是比spring mvc慢
4、有些人说init的时间长,这个有点道理,但测试的时候可以通过“预热”的办法规避。
5、有些说什么这种测试条件不能代表所有情况的呀,典型的睁眼说瞎话。又不想说了。

其实struts2比spring慢很容易解析,这与struts的设计哲学相关,struts的设计者不在乎对象的多少,在乎的是如何与Servlet解耦,每个请求一个Action实例,可以优雅的OO,QueryString中的parameter会被注入到Action中设置的同名的field中。
那struts产生如此之多的短生命对象,我们就不用它了吗?建议大家都去实现一个自己的MVC框架你也同样会遇到这个问题的。
哥当年自己搞了个很简单的MVC,只实现了核心部分-控制跳转,无非根据一个url调用Action里指定的方法,通过分析字符串,可以将Action的名字和方法名都找到,问题是我每个请求都实例化一个Action吗?哥当年没敢这么做,而是在程序一启动的时候就实例化好所有的Action,当请求到来时找到对应的实例再调用它方法,这样做就要求开发人员不用将与本次请求相关的数据放到Action中,就跟Servlet一样,好处是对象少,坏处是要小心谨慎,自己拿捏吧。


每一楼都看了,还是pengzhoushuo说的不错,很多人都是随意意测,如:pengzhoushuo说的1、2、3、4点中已经解释了

貌似大家都浮躁,基本上走马观花的看东西,然后开始下结论了

我的测试结果:
环境:ubuntu desktop 64位,cpu core2 P8400 2.26G, 4G mem
jvm: sun jdk 1.6.0_23 64bit
64位tomcat7:maxThread=10,(运行测试时看到总内存使用了1.4G内存),java_opts=-server
struts2,spring3 mvc,helloworld.jsp(里面只有hello ${message})
用例:
  1. struts2 helloworld.do直接跳转到helloworld.jsp
  2. sprint mvc helloworld跳转到helloworld.jsp
MyEclipse中启动tomcat进行测试:
测试:ab -n 10000 -c 10 多次运行后结论
struts2:低于2000/s
spring3 mvc:4600->6000/s
直接访问jsp : 5000->7000/s

所以现在在突击spring3 mvc,学习下
94 楼 xw_gongchengshi 2010-12-07  
<p>关键是看怎么合理搭配使用,Struts2个人觉还好。</p>
<p> </p>
93 楼 pengzhoushuo 2010-12-07  
接上面的
其实jvm 会自动管理struts产生的大量对象,而对于一个典型的web流程 请求 --> mvc --> dao操作,花费在dao上的时间是最长的,老程序员写的程序大部分的web性能瓶颈都是在db上,这个是没办法的,虽说可以通过db pool和cache技术来缓解。所以说struts上的性能操作比起db来占不到零头,所以大可不必惊慌。
当然,对于精益求精的同学来说,可以通过对比选择最适合的。
另外,我们项目组就在用struts,而且自己有一套框架把ssh整起来了,感觉这些框架就是把程序员当”傻子“,你想犯错都难,而用Servlet,你稍不留神就会犯错了,当然我说的是对于新手。
92 楼 pengzhoushuo 2010-12-07  
哎,发现很多人都只停留在“用框架”的阶段,楼主测出来了,你们只知道一味的质疑,就不会自己动下手?概括一下质疑类型
1、hibernate影响了struts,请认真看主贴,LZ同时测试了有数据库操作和没数据库操作的情况;
2、什么spring暗地排斥struts呀,不想说了
3、OGNL和plus 什么XX,可以单纯地用各自MVC部分,你会发现struts还是比spring mvc慢
4、有些人说init的时间长,这个有点道理,但测试的时候可以通过“预热”的办法规避。
5、有些说什么这种测试条件不能代表所有情况的呀,典型的睁眼说瞎话。又不想说了。

其实struts2比spring慢很容易解析,这与struts的设计哲学相关,struts的设计者不在乎对象的多少,在乎的是如何与Servlet解耦,每个请求一个Action实例,可以优雅的OO,QueryString中的parameter会被注入到Action中设置的同名的field中。
那struts产生如此之多的短生命对象,我们就不用它了吗?建议大家都去实现一个自己的MVC框架你也同样会遇到这个问题的。
哥当年自己搞了个很简单的MVC,只实现了核心部分-控制跳转,无非根据一个url调用Action里指定的方法,通过分析字符串,可以将Action的名字和方法名都找到,问题是我每个请求都实例化一个Action吗?哥当年没敢这么做,而是在程序一启动的时候就实例化好所有的Action,当请求到来时找到对应的实例再调用它方法,这样做就要求开发人员不用将与本次请求相关的数据放到Action中,就跟Servlet一样,好处是对象少,坏处是要小心谨慎,自己拿捏吧。
91 楼 挪威的幽灵 2010-12-07  
你得出了什么结论
每个测试结果的条件相差太大
建议只修改一个条件测试
90 楼 lewisw 2010-09-27  
mtnt2008 写道
没有意义的比较,就像是说widows和linux那个系统好一样

没有好不好,只有适合不适合

你要是需要性能的话,可以直接用sevlet+jsp+jdbc,那样不是更好?



很有意义的比较,我的项目性能要求 + 这个比较结果, 我就可以决定我要用哪个了。

相关推荐

    struts2测试工具

    Struts2是一个非常著名的Java Web开发框架,由Apache软件基金会维护。...无论这个"鬼哥struts2测试工具.exe"具体是什么,理解并掌握Struts2的测试原理和最佳实践都是每个Struts2开发者必备的技能。

    struts2测试案例

    Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的MVC(Model-View-Controller)架构的应用程序。它建立在Apache Jakarta的.struts1之上,并吸取了其他框架的优点,如WebWork,提供了更丰富...

    struts2项目开发

    Struts2 项目开发 Struts2 是一个基于 Java Web 的框架,广泛应用于 Web 应用程序的开发。下面将从 Struts2 项目开发的角度,详细介绍 Struts2 框架的应用、开发流程、技术架构、实践经验等方面的知识点。 项目...

    Struts2与Struts1区别

    相比之下,Struts2 为每个请求创建一个新的 Action 实例,避免了线程安全问题。 3. **对 Servlet API 的依赖**: - Struts1 的 Action 直接依赖于 Servlet API,请求和响应对象会传入 execute 方法。而 Struts2 ...

    Struts2全部jar包

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它在Java Web开发中广泛应用,为开发者提供了构建可维护、可扩展的Web应用程序的结构。本资源包含的"Struts2全部jar包"是搭建Struts2项目的基础,确保了所有必要的...

    struts2所用到的jar包

    10. **测试支持**:Struts2提供了测试框架,如Struts2 TestNG插件,方便进行单元测试和集成测试,确保应用的正确性。 综上所述,Struts2的核心包和IO包是构建基于Struts2的应用程序不可或缺的部分,它们为开发者...

    Migrating From Struts1 To Struts2

    Struts2以其更加灵活的设计、丰富的特性以及更好的性能表现成为众多开发者的首选。本文将深入探讨如何从Struts1平稳过渡到Struts2,并分析两者之间的主要差异。 #### Struts1概述 Struts1是基于Java的开源Web应用...

    Struts2——教程

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Struts1的基础上进行了很多改进和增强,提供了更强大的功能和更好的性能。本教程将深入探讨Struts2的核心概念、架构以及实际...

    struts2 lib包

    2. **Struts2 Plugins**: Struts2支持多种插件来扩展其功能,例如Struts2-convention-plugin(基于约定的配置)、Struts2-dojo-plugin(提供Dojo JavaScript库的支持)、Struts2-json-plugin(支持JSON数据格式)。...

    Struts2 in action(struts2实战)

    - 拦截器栈是Struts2处理请求的关键,通过组合不同的拦截器,可以实现复杂的功能,如登录检查、异常处理、性能监控等。 - 自定义拦截器可以通过继承`com.opensymphony.xwork2.interceptor.Interceptor`接口实现。 ...

    struts1和struts2区别

    - **Struts2**:Action对象为每个请求创建一个新的实例,消除了线程安全问题,提高了性能。 3. **Servlet依赖**: - **Struts1**:Action直接依赖于Servlet API,需要HttpServletRequest和HttpServletResponse...

    Struts2漏洞2.0.xx升级为Struts-2.5.12步骤

    在Struts2的早期版本中,尤其是2.0.xx和2.3.28.1,存在一个名为CVE-2017-9791的安全漏洞,这是一个远程代码执行(RCE)漏洞,攻击者可以利用它来运行恶意代码,对服务器造成严重危害。因此,及时升级到修复了这些...

    Struts2的由来

    总的来说,Struts2是结合了Struts 1的广泛采纳和WebWork的创新设计的产物,它通过提供非侵入式设计、强大的数据绑定和可扩展的拦截器机制,为Java Web开发者提供了一个更高效、灵活的开发平台。

    Struts2-2.2.1

    Struts2-2.2.1作为一个基础版本,为开发者提供了稳定的开发平台,同时也为后续版本的更新和发展奠定了基础。在实际开发中,了解并掌握Struts2的核心概念和使用方法,有助于提升Web应用的开发效率和质量。

    struts2,spring

    4. **AOP集成**:Spring AOP可以与Struts2的拦截器一起工作,实现更细粒度的功能,如性能监控、日志记录等。 5. **数据访问**:Spring支持多种数据访问技术,如JDBC、Hibernate、MyBatis等,可以方便地与Struts2...

    struts2简单模拟

    Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的Web应用程序。它在Web开发领域中被广泛使用,特别是在企业级应用中,因为它提供了MVC(Model-View-Controller)设计模式的实现,有助于...

    struts2升级到Struts2 2.3.32相关jar包

    这包括单元测试、集成测试以及性能测试,确保升级没有引入新的错误或问题。 7. **回滚计划**:在进行升级之前,最好备份当前的工作环境,以便在升级出现问题时可以快速回滚到旧版本。 8. **文档更新**:更新项目...

    struts2核心包

    Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的MVC(Model-View-Controller)架构的应用程序。它是在经典的Struts 1框架基础上发展起来的,旨在提供更优雅、灵活和可扩展的解决方案。...

    struts 2教程资料

    2. **配置文件**:Struts 2使用XML配置文件(通常为struts.xml)来定义Action类、结果页面以及拦截器等。配置文件允许开发者声明性地设置URL映射和处理流程。 3. **拦截器**:拦截器是Struts 2的一个强大特性,它们...

    struts2 发布包

    1. **发布时间**:Struts2 1.3.9发布于2007年,那时的Web开发环境与现在有很大差异,安全性和性能方面可能没有现代版本那么完善。 2. **API限制**:相比后续版本,1.3.9的API可能较为有限,某些功能可能尚未引入或...

Global site tag (gtag.js) - Google Analytics