【張逸】ASP.NET:效能與快取
一、避免不必要的執行操作
Page_Load和IsPostBack
在ASP.NET中,使用者每次點選頁面,包括點選頁面上的控制元件,都會激發Page_Load事件。例如如下程式碼:
// set up a connection and command here
if (!Page.IsPostBack) {
String query = "select * from Authors where FirstName like '%JUSTIN%'";
myCommand.Fill(ds, "Authors");
myDataGrid.DataBind();
}
}
void Button_Click(Object sender, EventArgs e) {
String query = "select * from Authors where FirstName like '%BRAD%'";
myCommand.Fill(ds, "Authors");
myDataGrid.DataBind();
}
先拋開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程式碼中設定:
三、謹慎使用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,因此我們需要對控制元件進行重新設定:
如果要禁止頁面所有Server Control的ViewState,則使用:
四、不要用Exception控制程式流程
捕獲異常對效能的損耗是眾所周知的。因此能夠避免Exception,最好不用。例如:
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動態資料型別,方法是:
六、其它提高效能的技巧
1、使用儲存過程資料訪問
2、只讀資料訪問不要使用DataSet,而是使用SqlDataReader代替DataSet,因為SqlDataReader是read-only, forward-only
3、關閉ASP.NET的Debug模式
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-343460/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【張逸】ASP.NET:效能與快取[續]ASP.NET快取
- 【張逸】ASP.Net中控制元件的EnableViewState屬性ASP.NET控制元件View
- Redis 入門與 ASP.NET Core 快取RedisASP.NET快取
- 張逸:程式碼的體格
- Asp.Net MVC 快取ASP.NETMVC快取
- ASP.NET 2.0快取ASP.NET快取
- HTTP前端效能優化(壓縮與快取)HTTP前端優化快取
- ASP.Net快取總結ASP.NET快取
- ServiceWorker 快取與 HTTP 快取快取HTTP
- 5、快逸網站大改版網站
- ASP.NET Core - 快取之分散式快取ASP.NET快取分散式
- ASP.NET Core 中的快取ASP.NET快取
- ASP.NET快取的方法分析ASP.NET快取
- ASP.NET清除頁面快取ASP.NET快取
- Web 快取機制 與 快取策略Web快取
- http快取與cdn快取配置指南HTTP快取
- ASP.NET Core - 快取之記憶體快取(上)ASP.NET快取記憶體
- ASP.NET Core - 快取之記憶體快取(下)ASP.NET快取記憶體
- ASP.NET的快取依賴機制-SQL快取依賴篇ASP.NET快取SQL
- 張逸:程式碼最大的敵人就是體格
- asp.net輸出快取的使用ASP.NET快取
- ASP.NET使用Redis共享快取示例ASP.NETRedis快取
- ASP.NET Core與Redis搭建一個簡易分散式快取ASP.NETRedis分散式快取
- 快取專題:HTML5離線快取與HTTP快取快取HTMLHTTP
- Django效能之道:快取應用與最佳化實戰Django快取
- 瀏覽器的快取機制—強快取與協商快取瀏覽器快取
- 瀏覽器強快取與協商快取瀏覽器快取
- Glide - 記憶體快取與磁碟快取IDE記憶體快取
- 張逸: ThoughtWorks(中國)程式設計師讀書雷達程式設計師
- ASP.NET快取:方法和最佳實踐ASP.NET快取
- 快取與緩衝快取
- 304與快取快取
- 快取Apache Spark RDD - 效能調優快取ApacheSpark
- 什麼是redis的快取雪崩與快取穿透Redis快取穿透
- VMware 與 SmartX 分散式儲存快取機制淺析與效能對比分散式快取
- 瀏覽器快取淺談(強快取與協商快取的認知)瀏覽器快取
- C# ASP.NET系統快取全解析C#ASP.NET快取
- ASP.NET快取:方法和最佳實踐 (轉)ASP.NET快取