ASP.NET幾種進行效能最佳化的方法及注意問題
來源:互聯網
上載者:User
asp.net|問題|效能|最佳化 網站的效能對於ASP.NET程式開發人員來說非常重要。一個優秀的網站雖然有美觀的頁面設計,完善的服務功能,但是開啟網頁時有長時間的延遲,使用者最終將會無法忍受。尤其對於大型的電子商務網站而言,每秒鐘有數萬使用者同時訪問,沒有良好的網站效能,根本無法滿足龐大的需求。
ASP.NET作為全新一代的動態網頁產生系統,它在平台效能方面與原有的ASP相比已有了一個本質的提高。但要在此基礎上開發出專業水準的、符合生產標準的、受使用者歡迎的web應用程式,還需要開發人員從編程的角度在頁面、資料訪問和字串處理等各方面進行最佳化處理,以提高網站的總體效能。
本文將主要探討在ASP.NET中與此相關的幾種進行效能最佳化的方法及注意問題。
頁面效能最佳化
1、工作階段狀態的恰當選擇
HTTP協議是一種無狀態的通訊協定,無法記錄和識別來自不同用戶端的請求,但在實際應用中系統卻要維護來自用戶端的不同請求之間的工作階段狀態資訊。ASP.NET通過將工作階段狀態資訊儲存在進程、狀態伺服器或SQL Server資料庫中來解決這個問題。
將工作階段狀態資訊儲存在WEB伺服器的記憶體中具有最佳的效能,速度很快,但是卻缺乏工作階段狀態資訊跨越多個伺服器的能力。若要在多個WEB伺服器之間維護會話資訊,可以使用狀態伺服器進行儲存,這種方式由於可以將應用程式部署到多台伺服器上而提高了系統的伸縮性和可靠性,但是以降低效能為代價。對於極其重要的會話資訊,需要使用SQL Server儲存方式,從而避免丟失重要的會話資訊,但由此產生的工作負載比前兩者大得多。
若不考慮狀態資訊的保留和多個伺服器共用,應盡量選擇儲存在伺服器的進程中,從而得到最佳的效能。
工作階段狀態資訊的儲存方式選擇通過web.config檔案:
<sessionState
mode="InProc/StateServer/SqlServer" //儲存方式由此行選擇
stateConnectionString="tcpip=127.0.0.1:42424"
……
timeout="20"/>
2、伺服器控制項的最佳化選擇
2.1 減少不必要的伺服器控制項
伺服器控制項帶來的方便和功能是html控制項所不能比擬的。但是每一個伺服器控制項都需要在伺服器端建立相應的對象,是以犧牲伺服器端的資源為代價的,過多的使用伺服器控制項會極大的影響程式效能。
很多情況下,簡單地使用html標記或資料繫結即能夠實現所需功能。比如<asp:Label>控制項,若使用它來顯示靜態資訊,則完全可用簡單的標記來實現。如果html控制項達不到所要實現的功能,而且在指令碼語言如javascript、vbscript也不能實現的情況下,才考慮選擇伺服器控制項。
2.2 禁用不必要的狀態視圖
伺服器控制項的狀態視圖屬效能夠自動的在頁面往返過程中維護伺服器控制項的狀態,減少開發人員的工作量,但是需要佔用大量的伺服器記憶體資源。因此,在不需要伺服器控制項狀態視圖的情況下,應將其EnableViewState屬性設定為false,如常用的<asp:Lable>和<asp:Button>控制項。
2.3 Page.IsPostBack的運用
Page.IsPostBack用於記錄頁面是否從用戶端返回,若為false表示初次運行,否則表示從用戶端再次返回該頁面。Page.IsPostBack的合理應用可以避免頁面在往返過程中的一些不必要的操作。在Page_Load函數及一些只需要初始化一次的事件函數中均可以使用該屬性來提高應用程式效能。
void Page_Load(Object o, EventArgs e)
{
if(! Page.IsPostBack)
{
conn=new SqlConnection("server=localhost;uid=sa;pwd=;database=data");
String sql="select * from student";
cmd.Fill(ds,"stu");
mydataGrid.DataBind();
}
}
以上代碼將保證只有在首次訪問該頁面時對資料庫進行讀取並綁定。
2.4 合理使用DataGrid控制項
DataGrid控制項帶有最強大的資料顯示功能,還內建了對資料的修改、刪除、添加、分頁等很多功能。如果只需簡單的顯示資料, DataGrid並非最佳選擇。DataGrid控制項的分頁功能,資料的儲存方式(儲存在viewstate中)等,雖然讓程式開發人員使用方便快捷,但由此產生的效能開銷不容小視。
DataList控制項比DataGrid功能少了很多。但自訂性強了很多。特有的多行資料顯示還是比較方便的。DataGrid能實現的功能,它基本能實現。
Repeater控制項功能最少,但自訂性非常強。由於減少了很多功能,對伺服器的效能帶來消耗最小。
因此,在只需簡單顯示資料列表時,選擇Repeater或DataList控制項同樣可以達到目的,而且減輕了效能上的開銷。
資料庫訪問效能最佳化
1、資料庫的串連和關閉
訪問資料庫資源需要建立串連、開啟串連和關閉串連幾個操作。這些過程需要多次與資料庫交換資訊以通過身分識別驗證,比較耗費伺服器資源。ASP.NET中提供了串連池(Connection Pool)改善開啟和關閉資料庫對效能的影響。系統將使用者的資料庫連接放在串連池中,需要時取出,關閉時收回串連,等待下一次的串連請求。
串連池的大小是有限的,如果在串連池達到最大限度後仍要求建立串連,必然大大影響效能。因此,在建立資料庫連接後只有在真正需要操作時才開啟串連,使用完畢後馬上關閉,從而盡量減少資料庫連接開啟的時間,避免出現超出串連限制的情況。
2、使用預存程序
預存程序是儲存在伺服器上的一組先行編譯的SQL語句,類似於DOS系統中的批次檔。預存程序具有對資料庫立即訪問的功能,資訊處理極為迅速。使用預存程序可以避免對命令的多次編譯,在執行一次後其執行規劃就駐留在快取中,以後需要時只需直接調用緩衝中的二進位代碼即可。
另外,預存程序在伺服器端運行,獨立於ASP.NET程式,便於修改,最重要的是它可以減少資料庫動作陳述式在網路中的傳輸。
3、最佳化查詢語句
ASP.NET中ADO串連消耗的資源相當大,SQL語句啟動並執行時間越長,佔用系統資源的時間也越長。因此,盡量使用最佳化過的SQL語句以減少執行時間。比如,不在查詢語句中包含子查詢語句,充分利用索引等。
字串操作效能最佳化
1、使用實值型別的ToString方法
在連接字串時,經常使用"+"號直接將數字添加到字串中。這種方法雖然簡單,也可以得到正確結果,但是由於涉及到不同的資料類型,數字需要通過裝箱操作轉化為參考型別才可以添加到字串中。但是裝箱操作對效能影響較大,因為在進行這類處理時,將在託管堆中分配一個新的對象,原有的值複製到新建立的對象中。
使用實值型別的ToString方法可以避免裝箱操作,從而提高應用程式效能。
2、運用StringBuilder類
String類對象是不可改變的,對於String對象的重新賦值在本質上是重新建立了一個String對象並將新值賦予該對象,其方法ToString對效能的提高並非很顯著。
在處理字串時,最好使用StringBuilder類,其.NET 命名空間是System.Text。該類並非建立新的對象,而是通過Append,Remove,Insert等方法直接對字串進行操作,通過ToString方法返回操作結果。
其定義及動作陳述式如下所示:
int num;
System.Text.StringBuilder str=new System.Text.StringBuilder(); //建立字串
str.Append(num.ToString()); //添加數值num
Response.Write(str.ToString); //顯示操作結果
ASP.NET應用程式效能測試
在對ASP.NET應用程式進行效能測試之前,應確保應用程式沒有錯誤,而且功能正確。具體的效能測試可以採用以下工具進行:
Web Application Strees Tool (WAS)是Microsoft發布的一個免費測試載入器,可以從http://webtool.rte.microsoft.com/上下載。它可以類比成百上千個使用者同時對web應用程式進行訪問請求,在伺服器上形成流量負載,從而達到測試的目的,可以產生平均TTFB、平均TTLB等效能匯總報告。
Application Center Test (ACT) 是一個測試載入器,附帶於Visual Studio.NET的企業版中,是Microsoft正式支援的web應用程式測試載入器。它能夠直觀地組建圖表結果,功能比WAS多,但不具備多個客戶機同時測試的能力。
伺服器作業系統"管理工具"中的"效能"計數器,可以對伺服器進行監測以瞭解應用程式效能。
結論
對於網站開發人員來說,在編寫ASP.NET應用程式時注意效能問題,養成良好的習慣,提高應用程式效能,至少可以延遲必需的硬體升級,降低網站的成本。