前次寫完《別總以為asp.net mvc比asp.net web form好--web form的頁面也可以體積小巧》后,收到不少評論。多數人不贊成本人提出的將viewstate放入session的做法。那么就來試驗一下。搭建一個性能測試對比的平台。做一個應用,分別用asp.net web form來實現和用asp.net MVC來實現。兩個應用的頁面外觀是一致的。再搭建分布式的服務器,反向代理等。再加上一個性能測試用的http負載產生服務器。
性能測試環境
如下圖:

性能測試服務器產生大量http請求來轟擊反向代理的服務器。反向代理服務器用Round Robin的算法將這些請求導向到里面的服務器。里面的服務器返回http響應給反向代理的服務器,反向代理服務器再向性能測試服務器響應。
Server1和Server2的配置:2GB RAM, 1個 2GHz CPU,300G 硬盤 Windows Server 2008 R2
反向代理服務器的配置: 1GB RAM, 1個 2GHz CPU, 80G硬盤 Ubuntu Linux 11.04,
性能測試服務器配置:1GB RAM, 1 個 2GHz CPU, 80G硬盤 Windows XP
數據庫服務器配置: 4GB RAM, 1 個 2G Hz CPU, 500G硬盤 Windows Server 2008 R2
也看到了,都是普通的機器。
反向代理所用軟件 squid 3.1.4
Server1和Server2部署的是一樣的應用程序,即asp.net web form的應用程序和asp.net MVC的應用程序都部署到這兩台服務器上。同時Server1和Server2訪問的是同一個數據庫。在應用程序里做了一些web farm的配置。使得session存儲在sql server的ASPState數據庫中。Session數據就可在不同服務器上進行浮動。http請求可由Server1和Server2任何一個來響應。當然這里是只用了兩個IIS服務器,可以加更多的。但是條件有限,只找得到兩台。這是最小的分布式的場景。如果有更多的話,整個系統的總體性能會更好一些。這里的網絡都是局域網絡。
這里說一下如何對比。這里是用同一個應用程序的asp.net web form版本和asp.net MVC版本進行對比。從上面看到了,硬件都是一樣的。軟件這塊,划分了常見的三層,BLL, DAL, 都是一樣的。唯一的不同是表示層的技術,一個用的是asp.net web form, 一個用的是asp.net MVC。其他的環節都是一樣的,只有這個表示層技術不同。對比的就是這個表示層技術。得說明的是,在asp.net web form中,采用了將viewstate放入session的方式。這樣做的目的,其實前文的時候已經在評論中說明過,是為了將web form的HTML頁面體積縮小,同時使viewstate和session一樣獲得在不同服務器之間浮動的特性。
這里是代碼的download:(用的最古老的ado.net,沒有采用TransactionScope,原因自己想。沒有采用aop,所以重復代碼好多,代碼生成器生成的,根本不費事、、、不跑題太遠,實在想說可以另寫文章)。
性能測試
下面就說這個性能測試了。采用了loadrunner 8.1。先錄腳本,再調試一下腳本,這都是基本功了,不多說。准備好腳本,一個腳本是測試asp.net web form的,另一個腳本是測試asp.net MVC的。之后將這些腳本對着這個反向代理服務器轟擊。開始時是試探性的,只用10個用戶,沒有問題,再加,試了還沒有問題,再加,如此循環下去,直到,加壓到一定程度,這個性能測試中返回有失敗的case時,才停下。采用這種方式,試了很多,發現這些數據:
asp.net web form用戶為600時:

asp.net web form 用戶數為800時:

asp.net web form 用戶數為1200時:

asp.net web form 用戶數為1500時,才出現了失敗的case:

asp.net MVC 用戶數為600時,就已經開始有失敗的case:

asp.net mvc 用戶數為800時,失敗的case多了一點點:

asp.net mvc 用戶數為1200時,失敗的case又多了一些:

asp.net mvc 用戶數為1500時,失敗的case又多了一些:

完整的測試結果下載: download 包括loadrunner報告和loadrunner截屏。
結論
經過這些對比。asp.net web form加上viewstate放入session中的安排,其性能並不輸給asp.net MVC。而且略有一點點占優。還是之前說的觀點:只要沒有過度地使用viewstate或者session,合理地利用viewstate和session(如何合理利用,可以見《關於大型asp.net應用系統的架構—如何做到高性能高可伸縮性》),asp.net web form也可以在性能上表現比較好的,甚至有可能超過asp.net MVC的表現。所以不要輕易地下結論,也不要輕易地否定一個技術。當然了,這里可能還是有些局限性,看到的是片面的。期望大家給予你們的真知灼見。
2012.07.10. 21:47增加內容
針對下面評論中的意見,做了一個web form未優化時的性能測試。之前做的所謂優化,就是將viewstate放到session里了。見web form工程里的那個BasePage類。如果讓所有aspx的后端類都繼承System.Web.UI.Page類,就去掉了這個所謂的優化。經過測試,發現即使什么優化都沒有,web form還是要比asp.net mvc的性能好。一直壓到1400個用戶時才出現失敗的case.

可以看到,未加viewstate放入session特性,最大用戶為1400,加了viewstate放入session特性,最大用戶為1500,所以將viewstate放入session中后,所帶來的性能的改進似乎很有限。
當然還有評論建議都做優化后再對比。可以以后再來做。今天就暫時這樣了。謝謝
end of 20120710添加內容
