天天看點

ASP.NET:性能與緩存

在MSDN網絡課堂中下載下傳了一些九月份的網絡講座。 有很多還是很有意義的。《ASP.NET系列講座之一:性能與緩存》是由微軟開發工具專家王立楠講授。王先生的講解非常清晰,課件也很詳細,雖然是網絡講 座,但Down下來的視訊檔案聲音很清晰。仔細聽了一遍,把其中的某些要點記錄了下來。

此講主要是介紹了一些tip,以提高ASP.NET的性能。以下就是講座介紹的一些技巧:

一、避免不必要的執行操作

Page_Load和IsPostBack

在ASP.NET中,使用者每次點選頁面,包括點選頁面上的控件,都會激發Page_Load事件。例如如下代碼:

ASP.NET:性能與緩存
ASP.NET:性能與緩存

void Page_Load(Object sender, EventArgs e)

ASP.NET:性能與緩存

{

ASP.NET:性能與緩存

        //

ASP.NET:性能與緩存

set up a connection and command here

ASP.NET:性能與緩存
ASP.NET:性能與緩存
ASP.NET:性能與緩存

        if (!Page.IsPostBack)

ASP.NET:性能與緩存
ASP.NET:性能與緩存

            String query = "select * from Authors where FirstName like '%JUSTIN%'";

ASP.NET:性能與緩存

            myCommand.Fill(ds, "Authors");

ASP.NET:性能與緩存

            myDataGrid.DataBind();

ASP.NET:性能與緩存

        }

ASP.NET:性能與緩存

    }

ASP.NET:性能與緩存
ASP.NET:性能與緩存
ASP.NET:性能與緩存

    void Button_Click(Object sender, EventArgs e)

ASP.NET:性能與緩存
ASP.NET:性能與緩存

        String query = "select * from Authors where FirstName like '%BRAD%'";

ASP.NET:性能與緩存

        myCommand.Fill(ds, "Authors");

ASP.NET:性能與緩存

        myDataGrid.DataBind();

ASP.NET:性能與緩存
ASP.NET:性能與緩存

先 抛開Page_Load事件中的if語句不管。在使用者點選頁面時,會執行Page_Load中的代碼,它實作了查詢資料表并将結果放到DataGrid中 的功能。同時,我們在Button的Click方法中也實作了查詢資料表并傳回結果的功能,隻是查詢的資料表和條件略有不同。如果沒有if語句,那麼當用 戶單擊Button時,它會先執行Page_Load,然後再響應Button的Click事件。顯然此時執行Page_Load是沒有必要的。為什麼會 這樣呢?因為HTTP協定是瞬時斷開的。隻要資料傳輸完畢,HTTP協定就會斷開浏覽器和伺服器的連接配接。每當使用者做出新的操作時,如單擊頁面上的 Button,又會重新連接配接頁面,此時必然會響應Page_Load事件。

是以,我們需要在Page_Load中判斷 Page.IsPostBack的屬性。該屬性訓示該頁是否正為響應用戶端回發而加載,或者它是否正被首次加載和通路。如果是首次加載,則為false; 否則為true。是以這裡的Page_Load代碼表達的含義是:如果頁面被首次加載,則執行if裡面的代碼;否則忽略。是以,當使用者單擊Button 時,由于頁面之前已經被加載,是以會跳過Page_Load裡的代碼,這就大大地提升了ASP.NET的性能。

二、關閉不必要的Session狀态

ASP.NET 使用Session來儲存使用者的相關資訊,這些資訊是儲存在伺服器端的。Session主要與客戶授權相關。如果提供了Session狀态,當每次調用頁 面時,都會首先查詢Session狀态,這必然影響了頁面執行的性能。是以,如果你提供的隻是普通的頁面,和客戶授權無關,應該關閉Session狀态。 也許有人認為頁面的Session狀态影響的性能是很微小的,幾乎可以忽略不計。然而試想你要做的項目涉及到的頁面非常之多,每次查詢Session所耗 費的時間,累計起來,對性能的影響仍然是可觀的。關閉Session狀态的方法是在ASP.NET的html代碼中設定:

<%@ Page EnableSessionState="false" %>

三、謹慎使用Server Control

1、不必要時可以不使用Server Control

在 ASP.NET中提供了兩種控件:Server Control和标準的HTML控件。HTML控件隻響應用戶端事件,而Server Control提供了RunAtServer屬性,它會在伺服器端建立對象的映射。它的功能比HTML控件更強大,但會損耗一定的性能。是以,在設計頁面 時,應根據實際的情況選擇控件。如果隻需要響應用戶端事件,那麼最好選擇HTML控件,這會大大提高ASP.NET的性能。

2、不必要時可以關閉Server Control的ViewState

ViewState 與Session、Application一樣記錄的都是ASP.NET中的狀态。但ViewState作用的範圍隻限于頁面。對于相同使用者相同頁面,控 件的ViewState是相同的。由于控件可能會用到不同的頁面中,Server Control通過ViewState來記錄不同的資料狀态。

但 是并非所有的Server Control都需要ViewState。例如一個DataGrid控件,如果我們隻是将DataSet填充到該控件中,并不對其中的資料進行操作,就不 需要設定ViewState。由于ASP.NET中是将Server Control的ViewState預設設定為true,是以我們需要對控件進行重新設定:

<asp:datagrid EnableViewState="false“ runat="server"/>

如果要禁止頁面所有Server Control的ViewState,則使用:

四、不要用Exception控制程式流程

捕獲異常對性能的損耗是衆所周知的。是以能夠避免Exception,最好不用。例如:

<%@ Page EnableViewState="false" %>

try {

result = 100 / num;

}

catch (Exception e) {

result = 0;

上面的代碼會捕獲除數為0的異常。此時,完全可以用if語句來控制程式流程:

if (num != 0)

    result = 100 / num;

else

     result = 0;

五、禁用VB和JScript動态資料類型

在 ASP.NET中,為了保持對ASP的相容,保留了VB和JScript的動态資料類型。但在C#和VB.NET中,是不能使用動态資料類型的。由于使用 動态資料類型會大量的占用運作時CPU,是以會影響到程式的性能,是以建議關閉VB和JScript動态資料類型,方法是:

<%@ Page Language="VB" Strict="true" %>

六、其它提高性能的技巧

1、使用存儲過程資料通路

2、隻讀資料通路不要使用DataSet,而是使用SqlDataReader代替DataSet,因為SqlDataReader是read-only, forward-only

3、關閉ASP.NET的Debug模式