[ASP.NET]非程式面的效能問題(1)-頻寬

[ASP.NET]非程式面的效能問題(1)-頻寬

程式面的效能問題我想大家大概都知道怎麼處理了,但一些非程式面的效能問題卻時常困擾著大家,我這邊將陸續針對幾個常見的非程式面效能問題作一些探討,首先來探討ViewState這東西對效能的影響,ViewState是用來記錄畫面元件的狀態的隱藏欄位,透過ViewState,畫面的值可以在postback後進行狀態保存,我們檢視網頁的原始碼時可以看到類似以下的內容:

viewstate

其中有一段<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wE………>這段就是所謂的ViewState,至於為什麼我為什麼說ViewState會大大的影響網頁的效能呢?請看我以下的範例:

首先我寫了一個網頁,網頁的內容只去撈取Northwind資料庫的Orders資料表,全部大概有500筆資料左右,在我本機執行,開啟這個網頁大概只要兩秒鐘,但當我將此網頁放到Server上,我在連線去開啟時,卻發現開啟花了6秒鐘,

viewstate2

於是這時我啟用了我的小幫手Httpwatch來幫我查看我的網頁到底出了什麼狀況,

viewstate3

 

 

一看之下,不得了,Received竟然快要700K,也就是說我下載的流量約700K,以頻寬2M/512來說,下載的極限速度每秒約200K左右,下載700K大約要花3-4秒鐘,所以整體執行的時間花了約6秒鐘,這非常驚人,如果同時有100個人使用,Server要提供的頻寬該有多高?

如果我再把這個GridView作一些版型套用,怪怪,不得了了,流量差不多是750K左右了,不過這還不是最讓人驚訝的,更讓人驚訝的陸續有來,這個網頁上方有個button,按下這個button只會做postback而已。

viewstate4

 

按下button後,在我的機器上大約花了2-3秒鐘完成,但放上Server後,執行一次竟然需要接近15秒鐘,再用httpwatch看了下,下載的流量大致上是一模一樣的,但看一下Send(上傳)的流量,竟然達370K左右,這太可怕了,以頻寬2M/512來說,上傳的極速約為55K上下,370K大約需要花費7秒鐘,所以這樣簡單的一個網頁,放到Server上去執行,我們大約就要花12秒鐘左右的傳輸時間,這個傳輸量實在太可怕了。

viewstate5

這是為什麼?我想愛用Gridview的人大概都嚇了一跳吧,這是因為Gridview每個cell的值與狀態都是透過ViewState來記錄,資料量愈大ViewState就愈大,而Postback時client會將這些ViewState中的內容傳到Server上,因此ViewState的量幾乎決定了網頁上傳的流量,非常可怕。

 

為了解決ViewState的問題,我們通常會採用幾個方法:

1.將網頁禁用ViewState

2.不要用Gridview

3.壓縮ViewState

 

今天要談的方案是3.,方法可以參考我在小舖BLOG寫的一篇文章:http://itgroup.blueshop.com.tw/gipi/blog?n=convew&i=6316

依以上的做法做完後,再測試一下,發現上傳的流量減少為55K左右,連下載流量都減少為435K左右,整個速度也由15秒左右進步到5-6秒鐘左右,改善了快要10秒鐘,是不是快很多呢?

viewstate6

這樣壓縮有沒有什麼疑慮呢?有的,就是Server端的CPU與記憶體的耗用會提高一些,但比起頻寬的費用,硬體的費用畢竟比較便宜,因此多裝一台Server也比頻寬多加10M來的便宜的,呵呵。

另外針對下載的部分,也可以參考我在小舖的另一篇文章:http://itgroup.blueshop.com.tw/gipi/blog?n=convew&i=6313

這一篇針對網頁作壓縮,是由Server將要回傳給client的網頁作壓縮,然後由Client做解壓縮,如果將壓縮等級設定到10級,大約可以減少70-80%的流量,整體所需的頻寬就整個降低下來囉,改善前後絕對給你完全不同的感受。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。