2007年2月19日 星期一

ViewState 滾開!



  在 ASP.NET 的架構下, 最令人驚奇的就是 ViewState 的存在. ViewState 是 ASP.NET 的靈魂, 巧妙地避開 Http stateless 的先天限制, 讓 Web ap 也能享有狀態存留, 事件觸發等原本屬於 Winform AP 的開發特性.


  ASP.NET 的 ViewState 的自動化讓開發人員可以很輕易就發展出高互動的網站, 但是他也讓 ASP.NET 背上效能不佳的罪名, 濫用伺服端控制項的人最終會發現, ViewState 的包袱是很沉重的, 就像是惡魔的交易, 必須用靈魂般沉重的代價換取.



  儘管微軟一直強調 ASP.NET 的開發效能與執行效能評比, 遠超過老爸 ASP 甚多, 但這些效能評比都是在 Server 上作評比, 沒太多人想過在 Client 上的效能評比又如何. 當然這是因為比較 client 端的變數太多, 受限於 End user 端的硬體等級, 頻寬等級..., Server 端評比是單純容易多了.


  但是在現今電腦硬體越來越快, 價格越來越低廉, 這些 CPU 上的數據其實已經不如以往重要, 相比之下, 頻寬效能才是重點. 單比頻寬就會發現 ASP.NET 是龐大且反應緩慢的怪物, 真兇就是 ViewState + PostBack 兩者. 一般拿來做企業 / 公司內的 AP 還不會有人發現其嚴重性, 反正都是 Intranet 區域網路, 動輒上百 M 的頻寬在流竄, 拿來做 Internet AP 就會發現客戶抱怨聲此起彼落. 我也是拿 ASP.NET 做了個電子商務訂單系統, 才被這看似好用的糖衣陷阱搞得七葷八素. 為了滿足客戶對效能的期望, 盡量關閉不必要的 ViewState, 開始手工打造 Jscript 來減少 PostBack 的次數.


  ASP.NET 要做到頻寬的最佳化可是條艱辛的路, 所幸, 在網路上發現高人指點, 可以將 ViewState 儲存於 Server 的 Session 之中的偷吃步做法, 減少傳輸的頻寬量, 花了點時間研究, 今天總算改良完畢, 做出來的效能我相當滿意.



  不過這個偷吃步是用 Server 的記憶體空間換取時間效能的做法, 同時上線人數一多, Server 應該會爆吧? 管他的, 反正是花錢租來的主機, 不是我家的機器, 記憶體就給他吃吧. 客戶滿意度最重要! ^_^ Y


  參考文獻:
  CodeProject : Keep ASP.NET ViewState out of ASPX Page for Performance Improvement
  - 作者: Regis Daniel de Oliveira

沒有留言:

張貼留言