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

造了个轮子^_^,firefly应用程序框架,性能大幅超越spring3MVC和Struts2,含测试报告

    博客分类:
  • java
阅读更多

现在的开源框架都是大而全,动辄xxMB的jar包,感觉用不了那么多的功能,而且性能有些不尽如人意。所以还是自己造个轮子吧。

 

firefly的特性

  • 高性能,性能大幅超越spring3、struts2等,详情请看性能测试报告
  • 精简、轻量、无侵入,firefly.jar只有44k
  • core包含IOC、MVC、Interceptor等常用功能
  • 使用简单,基于约定优于配置的思想,默认使用Annotation配置方式

 

firefly的使用风格类似Spring3,具体可以看

http://code.google.com/p/firefly/wiki/guide

 

代码已经发布到 google code ,有兴趣的同学可以一起来开发

http://code.google.com/p/firefly/

 

 

测试环境

  • windows7 jdk1.6.0_22
  • JDK参数:-Xms128m -Xmx512m -XX:+DisableExplicitGC
  • 服务器:jetty 6.1.25
  • CPU: T6600 内存:3G
  • 测试工具:JMeter

用例1测试报告

往JSP打印“你好 firefly!”

500线程,循环2次

取跑10次之后的成绩

框架 版本 吞吐量 错误率
fireflyMVC 1.0-SNAPSHOT 38910.506/分钟 0%
Servlet 2.5 38022.814/分钟 0%
Spring3MVC 3.0.5.RELEASE 13106.16/分钟 0%
Struts2 2.2.1.1 1256.571/分钟 0%

 

用例1

往JSP打印“你好 firefly!”

JSP代码

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
        <title>firefly</title>
</head>
<body>
        ${hello}
</body>
</html>

 

firefly测试代码

        @RequestMapping(value = "/hello")
        public String index(HttpServletRequest request) {
                request.setAttribute("hello", "你好 firefly!");
                return "/index.jsp";
        }

 

Servlet测试代码

        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                request.setAttribute("hello", "你好 firefly!");
                request.getRequestDispatcher("/WEB-INF/page/index.jsp").forward(
                                request, response);
        }

 

Spring3MVC测试代码

        @RequestMapping(value="/spring", method=RequestMethod.GET)
        public String index(HttpServletRequest request) {
                request.setAttribute("hello", "你好 firefly!");
                return "/index";
        }

 

Struts2测试代码

    public String execute() throws Exception {
        setMessage("你好 firefly!");
        return SUCCESS;
    }

 

分享到:
评论
37 楼 Norther 2011-01-05  
请问童鞋你里面有什么特殊的算法,神奇的Magic处理让你的这个库变的飞快,让大家开开眼。
36 楼 hypercube1024 2011-01-05  
<div class="quote_title">aninfeel 写道</div>
<div class="quote_div">spring mvc3 是可以把请求参数注入到action方法的参数里的,而你的action方法只剩下request、response参数了。而且它的view不止是jsp,还有验证功能貌似也没有把。要模仿它应该还有一段路要走,到时模仿全了性能就不知道怎么样了。</div>
<p><br><br><br>请求参数注入到方法参数里面已经实现了^_^,现在的版本可以把请求参数注入到javabean里面,具体的用法和Spring也差不多,由于在之前的回帖里面,估计没有看到~~~,自动注入请求参数,我也大概测试了一下,比普通的注入request性能下降5%-10%吧</p>
35 楼 vb2005xu 2011-01-05  
我下下来学习了

感觉优势 就是 迷你
34 楼 aninfeel 2011-01-05  
spring mvc3 是可以把请求参数注入到action方法的参数里的,而你的action方法只剩下request、response参数了。而且它的view不止是jsp,还有验证功能貌似也没有把。要模仿它应该还有一段路要走,到时模仿全了性能就不知道怎么样了。
33 楼 hypercube1024 2011-01-04  
caoyangx 写道
不错,很喜欢,自己写一个框架很有成就感,我会一直关注的。

不得不说,NUTZ当初也很小,也是走着高性能路线。不过使用人群越来越多,需要支持的功能也越来越多,jar的体积自然越来越大,性能和当初轻装上阵的Nutz比,也略显差别。

其实自己写框架,就是为了方便开发自己熟悉领域的应用,一旦开源,有了用户,有了和你志同道合的参与者,你的框架也许会发生改变,也许改变会翻天覆地的。但为了自己的作品有一个好的未来,必须要改变,这也许很矛盾,不过也没办法。要么锋利无比但无人问津,要么家喻户晓却臃肿不堪。

最后以一首范玮琪的歌曲《最初的梦想》结尾,送给那些怀揣着自己的梦想,至今仍努力打拼的朋友们。



多些支持^_^,性能和小巧是要坚持的,其实更多的是方便自己项目开发,开发一个项目堆积动辄几十MB的开源库,总归是很不爽的
32 楼 caoyangx 2011-01-04  
不错,很喜欢,自己写一个框架很有成就感,我会一直关注的。

不得不说,NUTZ当初也很小,也是走着高性能路线。不过使用人群越来越多,需要支持的功能也越来越多,jar的体积自然越来越大,性能和当初轻装上阵的Nutz比,也略显差别。

其实自己写框架,就是为了方便开发自己熟悉领域的应用,一旦开源,有了用户,有了和你志同道合的参与者,你的框架也许会发生改变,也许改变会翻天覆地的。但为了自己的作品有一个好的未来,必须要改变,这也许很矛盾,不过也没办法。要么锋利无比但无人问津,要么家喻户晓却臃肿不堪。

最后以一首范玮琪的歌曲《最初的梦想》结尾,送给那些怀揣着自己的梦想,至今仍努力打拼的朋友们。
31 楼 yangguo 2011-01-04  
很不错,赞一个。千万不要臃肿化。
30 楼 hypercube1024 2011-01-04  
6407977 写道
freish 写道
弱弱的问一句,Firefly不是那个收费的、难用的、银行喜欢用的源码版本控制工具么?

确实是个版本控制工具呵呵,我在光大银行


  看来名字冲突啊~~~
29 楼 6407977 2011-01-04  
freish 写道
弱弱的问一句,Firefly不是那个收费的、难用的、银行喜欢用的源码版本控制工具么?

确实是个版本控制工具呵呵,我在光大银行
28 楼 hypercube1024 2011-01-04  
superxgz 写道
LZ有空的时候写个简单的WEB应用看看贝


嗯,功能稳定之后,做个完整的demo
27 楼 superxgz 2011-01-04  
LZ有空的时候写个简单的WEB应用看看贝
26 楼 smzd 2011-01-04  
不错不错,最近新兴工具狠时尚啊
25 楼 guofengcn 2011-01-04  
强烈的支持!有时做个东西,不一定就非得有在真正的项目上,纯粹的为了兴趣,更靠谱!
24 楼 xhdwell 2011-01-04  
为什么叫firefly,不是有个版本管理软件叫firefly吗?
23 楼 hypercube1024 2011-01-04  
<p>明天就要上班了,上班之前再更新了两个功能^_^</p>
<p> </p>
<p>主要增加了两个特性,</p>
<p> </p>
<p>1)ApplicationContext .getBean() 改成泛型的,这样就不用强制类型转换了。</p>
<p> </p>
<p style="margin: 0px;">public interface ApplicationContext {</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><span style="white-space: pre;"> </span>&lt;T&gt; T getBean(Class&lt;T&gt; clazz);</p>
<p style="margin: 0px;"> </p>
<p style="margin: 0px;"><span style="white-space: pre;"> </span>&lt;T&gt; T getBean(String id);</p>
<p style="margin: 0px;">}</p>
<p style="margin: 0px;"> </p>
<p>2) 增加了request请求参数自动封装到javabean功能</p>
<p><span style="font-family: arial, sans-serif; font-size: 13px;">
</span></p>
<ul style="padding-left: 40px;">
<li>自动封装请求参数到javabean,只要把方法的参数标记上@HttpParam<a style="color: #0000cc;" href="http://code.google.com/p/firefly/w/edit/HttpParam">?</a>即可,@HttpParam<a style="color: #0000cc;" href="http://code.google.com/p/firefly/w/edit/HttpParam">?</a>.value()是可选值,当不为空的时候会自动把Book对象setAttribute里面</li>
</ul>
<pre class="prettyprint"><span class="pln" style="color: #000000;">        </span><span class="lit" style="color: #006666;">@RequestMapping</span><span class="pun" style="color: #666600;">(</span><span class="pln" style="color: #000000;">value </span><span class="pun" style="color: #666600;">=</span><span class="pln" style="color: #000000;"> </span><span class="str" style="color: #008800;">"/book/add"</span><span class="pun" style="color: #666600;">)</span><span class="pln" style="color: #000000;">
        </span><span class="kwd" style="color: #000088;">public</span><span class="pln" style="color: #000000;"> </span><span class="typ" style="color: #660066;">String</span><span class="pln" style="color: #000000;"> gotoCreateBook</span><span class="pun" style="color: #666600;">()</span><span class="pln" style="color: #000000;"> </span><span class="pun" style="color: #666600;">{</span><span class="pln" style="color: #000000;">
                </span><span class="kwd" style="color: #000088;">return</span><span class="pln" style="color: #000000;"> </span><span class="str" style="color: #008800;">"/book_create.jsp"</span><span class="pun" style="color: #666600;">;</span><span class="pln" style="color: #000000;">
        </span><span class="pun" style="color: #666600;">}</span><span class="pln" style="color: #000000;">

        </span><span class="lit" style="color: #006666;">@RequestMapping</span><span class="pun" style="color: #666600;">(</span><span class="pln" style="color: #000000;">value </span><span class="pun" style="color: #666600;">=</span><span class="pln" style="color: #000000;"> </span><span class="str" style="color: #008800;">"/book/create"</span><span class="pun" style="color: #666600;">,</span><span class="pln" style="color: #000000;"> method </span><span class="pun" style="color: #666600;">=</span><span class="pln" style="color: #000000;"> </span><span class="typ" style="color: #660066;">HttpMethod</span><span class="pun" style="color: #666600;">.</span><span class="pln" style="color: #000000;">POST</span><span class="pun" style="color: #666600;">)</span><span class="pln" style="color: #000000;">
        </span><span class="kwd" style="color: #000088;">public</span><span class="pln" style="color: #000000;"> </span><span class="typ" style="color: #660066;">String</span><span class="pln" style="color: #000000;"> createBook</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">@HttpParam</span><span class="pun" style="color: #666600;">(</span><span class="str" style="color: #008800;">"book"</span><span class="pun" style="color: #666600;">)</span><span class="pln" style="color: #000000;"> </span><span class="typ" style="color: #660066;">Book</span><span class="pln" style="color: #000000;"> book</span><span class="pun" style="color: #666600;">)</span><span class="pln" style="color: #000000;"> </span><span class="pun" style="color: #666600;">{</span><span class="pln" style="color: #000000;">
                book</span><span class="pun" style="color: #666600;">.</span><span class="pln" style="color: #000000;">setSell</span><span class="pun" style="color: #666600;">(</span><span class="kwd" style="color: #000088;">true</span><span class="pun" style="color: #666600;">);</span><span class="pln" style="color: #000000;">
                book</span><span class="pun" style="color: #666600;">.</span><span class="pln" style="color: #000000;">setText</span><span class="pun" style="color: #666600;">(</span><span class="str" style="color: #008800;">"测试当前book"</span><span class="pun" style="color: #666600;">);</span><span class="pln" style="color: #000000;">
                book</span><span class="pun" style="color: #666600;">.</span><span class="pln" style="color: #000000;">setId</span><span class="pun" style="color: #666600;">(</span><span class="lit" style="color: #006666;">90</span><span class="pun" style="color: #666600;">);</span><span class="pln" style="color: #000000;">
                </span><span class="kwd" style="color: #000088;">return</span><span class="pln" style="color: #000000;"> </span><span class="str" style="color: #008800;">"/book.jsp"</span><span class="pun" style="color: #666600;">;</span><span class="pln" style="color: #000000;">
        </span><span class="pun" style="color: #666600;">}</span></pre>
<p>页面book.jsp</p>
<pre class="prettyprint"><span class="dec" style="color: #660066;">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;html&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;head&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;title&gt;</span><span class="pln" style="color: #000000;">firefly</span><span class="tag" style="color: #000088;">&lt;/title&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;/head&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;body&gt;</span><span class="pln" style="color: #000000;">
| ${book.id} | ${book.title} | ${book.text} | ${book.price} | ${book.sell} |
</span><span class="tag" style="color: #000088;">&lt;/body&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;/html&gt;</span></pre>
<p>页面book_create.jsp</p>
<pre class="prettyprint"><span class="dec" style="color: #660066;">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;html&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;head&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;title&gt;</span><span class="pln" style="color: #000000;">firefly</span><span class="tag" style="color: #000088;">&lt;/title&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;/head&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;body&gt;</span><span class="pln" style="color: #000000;">
&lt;form action="</span><span class="tag" style="color: #000088;">&lt;c:url</span><span class="pln" style="color: #000000;"> </span><span class="atn" style="color: #660066;">value</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"/app/book/create"</span><span class="tag" style="color: #000088;">&gt;&lt;/c:url&gt;</span><span class="pln" style="color: #000000;">" method="POST"&gt;
        书名:</span><span class="tag" style="color: #000088;">&lt;input</span><span class="pln" style="color: #000000;"> </span><span class="atn" style="color: #660066;">type</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"text"</span><span class="pln" style="color: #000000;"> </span><span class="atn" style="color: #660066;">name</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"title"</span><span class="tag" style="color: #000088;">&gt;&lt;/input&gt;&lt;br/&gt;</span><span class="pln" style="color: #000000;">
        价格:</span><span class="tag" style="color: #000088;">&lt;input</span><span class="pln" style="color: #000000;"> </span><span class="atn" style="color: #660066;">type</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"text"</span><span class="pln" style="color: #000000;"> </span><span class="atn" style="color: #660066;">name</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"price"</span><span class="tag" style="color: #000088;">&gt;&lt;/input&gt;&lt;br/&gt;</span><span class="pln" style="color: #000000;">
        </span><span class="tag" style="color: #000088;">&lt;input</span><span class="pln" style="color: #000000;"> </span><span class="atn" style="color: #660066;">type</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"submit"</span><span class="pln" style="color: #000000;"> </span><span class="atn" style="color: #660066;">value</span><span class="pun" style="color: #666600;">=</span><span class="atv" style="color: #008800;">"提交"</span><span class="tag" style="color: #000088;">&gt;&lt;/input&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;/form&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;/body&gt;</span><span class="pln" style="color: #000000;">
</span><span class="tag" style="color: #000088;">&lt;/html&gt;</span></pre>
<p>输入价格:324 书名:fdsfsdf 后显示结果</p>
<pre class="prettyprint"><span class="pun" style="color: #666600;">|</span><span class="pln" style="color: #000000;"> </span><span class="lit" style="color: #006666;">90</span><span class="pln" style="color: #000000;"> </span><span class="pun" style="color: #666600;">|</span><span class="pln" style="color: #000000;"> fdsfsdf </span><span class="pun" style="color: #666600;">|</span><span class="pln" style="color: #000000;"> </span><span class="pun" style="color: #666600;">测试当前</span><span class="pln" style="color: #000000;">book </span><span class="pun" style="color: #666600;">|</span><span class="pln" style="color: #000000;"> </span><span class="lit" style="color: #006666;">324.0</span><span class="pln" style="color: #000000;"> </span><span class="pun" style="color: #666600;">|</span><span class="pln" style="color: #000000;"> </span><span class="kwd" style="color: #000088;">true</span><span class="pln" style="color: #000000;"> </span><span class="pun" style="color: #666600;">|</span><span class="pln" style="color: #000000;"> </span></pre>
<p> </p>
<p> </p>
<p> </p>
22 楼 hypercube1024 2011-01-04  
xiangkun 写道
shoru 写道
比servlet还快?什么情况?



+1


这个属于测试误差,性能基本和Servlet持平的
21 楼 xiangkun 2011-01-03  
shoru 写道
比servlet还快?什么情况?



+1
20 楼 shoru 2011-01-03  
比servlet还快?什么情况?
19 楼 itstarting 2011-01-03  
勇气可嘉,不过这个看上去还挺山寨的感觉,哈哈

Spring MVC 包括了很多其他的功能,比如binding/validation等,等你的框架功能对等以后,性能就真不好说了

不是说guice的AOP性能比spring强很多吗,但spring还是活的风生水起

对于企业应用软件,在一定程度上来说,单点的性能已经不是特别特别在意的了,关键点还是在于:
1)成本可控——快速开发
2)扩展性高——适应变化(当然了也包括性能需求的变化)
3)安全稳定——可用性和可维护下问题
诸如此类
18 楼 skzr.org 2011-01-03  
<div class="quote_title">我的机器core2 P8400 2.26G</div>
<div class="quote_title">测试时tomcat参数:-server -Xmx64M</div>
<div class="quote_title">应该不至于很差吧,单核机器就算了^ ^</div>
<div class="quote_title">hypercube1024 写道</div>
<div class="quote_div">
<div class="quote_title">skzr.org 写道</div>
<div class="quote_div">
<div class="quote_title">这个测试的和我测试的不一样</div>
<div class="quote_title">tomcat7 maxThread=10,mvc例子:jsp页面打印 hello world!</div>
<p><span>MVC测试:<br>使用ab -n 10000 -c 20 测试一个helloworld control!<br>spring3 mvc访问jsp速度高达5、6K/s<br>struts2(关闭log,关闭开发模式即devMode=false) mvc最高还达不到2K/s</span></p>
<div class="quote_title">不知道为什么,出入不小阿?</div>
</div>
<p>我在我的笔记本测试的,配置比较差哈^_^,基本上目前firefly和Servlet性能是持平的,但是Spring3MVC和Servlet还是有一定差距</p>
</div>
<p> </p>

相关推荐

Global site tag (gtag.js) - Google Analytics