1. 程式人生 > >純jsp,struts1,struts2,springMvc開發效能對比篇

純jsp,struts1,struts2,springMvc開發效能對比篇

看了幾篇關於三者的效能比較的文章:(這些文章和測試我並沒有做過實驗,僅用於參考)

  結論如下:

  注:測試都沒有資料庫,也沒有複雜業務,action和jsp中內容很簡單,目的就是測試MVC部分的效能。

  1.純JSP的效能應該最高,這不難理解,JSP被編譯成Servlet後,沒有任何多餘的功能,收到請求後直接處理。(這也驗證一句經典的話:越原始效率就越高。)

  2.struts1的效能是僅次於純JSP的,由於struts1採用單例Action模式,且本身的封裝相比struts2應該說簡單很多,雖然開發效率不如struts2,但已經過多年的實踐考驗,效能穩定高效。

  3.相比來說struts2的效能就比較差了,這不難理解,struts2之所以開發方便,是由於採用值棧、OGNL表示式、攔截器等技術對請求引數的對映和返回結果進行了處理,另外還採用大量的標籤庫等,這些都無疑增加了處理的時間。因此降低了效率。在我們實際的專案中,我測試本地工程訪問每秒處理請求數只能達到35左右,應該說還有不少可優化的空間。

  4.很多人認為struts2效能差是因為它的多例Action模式導致的,但我們採用spring管理struts2的Action,並設定按單例方式生成Action例項後,發現其效能有所提高,但並不是很明顯。由此可見,多例Action模式並不是struts2效能瓶頸所在。另外,我們在struts2中採用JSP方式訪問,發現其效能依舊和沒有采用任何MVC框架的純JSP之間存在好幾倍的差距,這又從另一個側面證實了我們剛才得出結論,struts2效能的瓶頸不在於它的多例Action模式。

  struts2框架效能很好, 但struts2的標籤效能太差了。 要避免使用 struts2標籤。

  Struts2 由於採用了 值棧、OGNL表示式、struts2標籤庫等,會導致效能下降,很嚴重的下降。如果避免或減少使用這些,效能還是很好的。

  Struts2的 多層攔截器、 多例項action效能都很好,並不是 導致效能問題的原因。

  5.SpringMVC3的效能略遜於struts1,但基本是同級別的,這讓人眼前一亮,springMVC有著不比struts2差的開發效率和解耦度,但效能卻是struts2的好幾倍,這讓我們灰常振奮,SpringMVC無疑又是專案開發的一個好的選擇。唯一的問題就是,目前國內使用面還不太多,各方面的參考資料相對較少,上手的話可能要稍微難點。

  我的結論:使用這三個框架並不會帶來數量級的效能影響,但可以提高開發效率。

  二、架構

  雖然三者都是基於MVC思想的架構框架,但是springMVC是REST架構思想的實現。

  struts1和springMVC的入口都是servlet,而struts2的入口是filter。

  三、springMVC與struts2比較:

  1、spring mvc是基於方法的設計,而sturts是基於類,每次發一次請求都會例項一個action,每個action都會被注入屬性,而spring基於方法,粒度更細,但要小心把握像在servlet控制資料一樣。spring3 mvc是方法級別的攔截,攔截到方法後根據引數上的註解把request資料注入進去,在spring3 mvc中,一個方法對應一個request上下文。而struts2框架是類級別的攔截,每次來了請求就建立一個Action,然後呼叫setter getter方法把request中的資料注入,struts2實際上是通過setter getter方法與request打交道的,struts2中,一個Action物件對應一個request上下文。

  2. 引數傳遞struts是在接受引數的時候,可以用屬性來接受引數,這就說明引數是讓多個方法共享的。

  3. 設計思想上,struts更加符合oop(面向物件程式設計)的程式設計思想, spring就比較謹慎,在servlet上擴充套件。

  4. intercepter的實現機制,struts有以自己的interceptor機制,spring mvc用的是獨立的AOP方式。這樣導致struts的配置檔案量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應

  所以說從架構本身上spring3 mvc就容易實現restful url。struts2是類級別的攔截,一個類對應一個request上下文實現restful url要費勁因為struts2 action的一個方法可以對應一個url而其類屬性卻被所有方法共享這也就無法用註解或其他方式標識其所屬方法了。spring3 mvc的方法之間基本上獨立的獨享request response資料請求資料通過引數獲取處理結果通過ModelMap交回給框架方法之間不共享變數而struts2搞的就比較亂雖然方法之間也是獨立的但其所有Action變數是共享的這不會影響程式執行卻給我們編碼讀程式時帶來麻煩。

  5. 另外spring3 mvc的驗證也是一個亮點,支援JSR303處理ajax的請求更是方便,只需一個註解@ResponseBody ,然後直接返回響應文字即可。