閱讀294 返回首頁    go 魔獸


Asp.Net頁麵請求性能大隱患 你是否做了這樣的事情

  項目測試中,客戶向我們反應,某個頁麵請求速度特別慢,簡直無法忍受。這裏簡單插一些情況的描述:對於一個使用人數、並發操作並不多的項目,客戶不會過多的在性能上提出要求,對他們來說,多幾百ms的等待時間,不會帶來更多情緒。

    但是,當你請求某個頁麵後,去泡杯茶回來,發現頁麵還死死的在那裏,進度條不緊不慢的一點一點增長,就無法忍受了。利用Firefox的debug測了一下,平均請求時間19s左右,而光import那個頁麵所需要的時間就是18s多,問題肯定出在頁麵上。

    那個頁麵是被IFreame包含進來的,包含5個TextBox、4個DropdownList、3個CheckBox、3個Button(作為分頁的查詢條件),下麵就是分頁的DataGrid(每頁10條數據)。我注意到其中有一個DropdownList的ListItem有200多項,查了一下Response,發現viewstate黑壓壓一塊。顯然,這也是影響性能的一個原因。

    在跟客戶商量後,將這個DropdownList改成了TextBox,做成模煳查詢。恩,速度到了15s左右,快了3到4秒。這樣的改善已經是很不錯的成績了,但是我們還要等待15s,顯然無法讓客戶滿意。

    這下問題就不明顯了,我禁用了viewstate,發現並沒有多少效果。頁麵數據量也不是很大啊,幾個DropdownList的初始化,分頁的實現是利用存儲過程,在服務器數據庫中,利用遊標取記錄條數。傳遞過來,也僅僅是10條而已。

    查看頁麵源代碼發現N長的JS,是不是問題出在加載日期控件上呢?我將日期控件屏蔽了,再測,問題依舊,還是15s!!

    感覺有點束手了,測試其他頁麵,沒有問題,響應速度很理想,甚至是一些控件N多的頁麵。

    不經意間點分頁的“下一頁”,恩,時間很漫長!可是我下一頁的操作,隻讀取了下一個10條數據啊!我在服務器查詢分析器下測試了存儲過程,反應沒問題。那問題應該是出在DataGrid的綁定了,這時候,我注意到,datagird中包含不少模板列,其中有不少LinkButton,涉及到顯示不顯示的邏輯操作,例如:

<asp:TemplateColumn>
        
<HeaderStyle Width="50px"></HeaderStyle>                         
        
<ItemTemplate>
                
<asp:LinkButton id="lbtnEdit1" runat="server" CausesValidation="false" CommandName="Disabled" Visible='<%# DataBinder. Eval(Container.DataItem, "IsDisable").ToString()=="1"  %>'> <span onclick="return confirm('確認作廢?')">作廢</span></asp:LinkButton>                                      
                
<asp:LinkButton ID="lbtnEdit2" runat="server" CausesValidation="false" CommandName="Able" Visible='<%# DataBinder.Eval(Container.DataItem,"IsDisable").ToString()=="2"  %>'><span onclick="return confirm('確認恢複?')">恢複</span></asp:LinkButton>                    
                
<asp:LinkButton ID="lbtnEdit3" runat="server" CausesValidation="false" CommandName="Disabling" Visible='<%# DataBinder.Eval(Container.DataItem,"IsDisable").ToString()=="0"  %>'><span onclick="return confirm('確認待報廢?')">待報廢</span></asp:LinkButton>
        
</ItemTemplate>
</asp:TemplateColumn>

 

    頓時,有了個想法,會不會是觸發ItemDataBind事件,遍曆表格控件時,消耗係統資源呢?

    將這部分功能屏蔽,果然!效果理想,響應時間到了3s左右,速度差強人意。我暗舒口氣......

    總結:

    viewstate利弊共存,怎麼使用,值得權衡。有時候,沒有辦法,不妨跟客戶溝通一下,變換一些實現方法。

    永遠不要在ItemDataBind時,做太多事情。不妨,將數據處理放在數據庫(視圖、存儲過程)、或者是在綁定之前,寫方法處理。

    性能永遠是一個隱形的需求,而我在這方麵經驗匱乏。尤其是,目前的項目規模小,那些在code時,留下的揮霍內存的變量聲明、占用CPU的循環、遍曆算法的行為隨處可見。現在,我們能做的,就是在意識到這些後,一點點的改變這些習慣把。

最後更新:2017-04-02 00:06:46

  上一篇:go 在惠普HP6531s筆記本上安裝xp的方法
  下一篇:go 逐行處理數據時避免死循環