網站的性能對於ASP
NET程序開發人員來說非常重要
一個優秀的網站雖然有美觀的頁面設計
完善的服務功能
但是打開網頁時有長時間的延遲
用戶最終將會無法忍受
尤其對於大型的電子商務網站而言
每秒鐘有數萬用戶同時訪問
沒有良好的網站性能
根本無法滿足龐大的需求
ASP
NET作為全新一代的動態網頁生成系統
它在平台性能方面與原有的ASP相比已有了一個本質的提高
但要在此基礎上開發出專業水准的
符合生產標准的
受用戶歡迎的web應用程序
還需要開發人員從編程的角度在頁面
數據訪問和字符串處理等各方面進行優化處理
以提高網站的總體性能
本文將主要探討在ASP
NET中與此相關的幾種進行性能優化的方法及注意問題
頁面性能優化 會話狀態的恰當選擇
HTTP協議是一種無狀態的通信協議
無法記錄和識別來自不同客戶端的請求
但在實際應用中系統卻要維護來自客戶端的不同請求之間的會話狀態信息
ASP
NET通過將會話狀態信息存儲在進程
狀態服務器或SQL Server數據庫中來解決這個問題
將會話狀態信息保存在WEB服務器的內存中具有最佳的性能
速度很快
但是卻缺乏會話狀態信息跨越多個服務器的能力
若要在多個WEB服務器之間維護會話信息
可以使用狀態服務器進行存儲
這種方式由於可以將應用程序部署到多台服務器上而提高了系統的伸縮性和可靠性
但是以降低性能為代價
對於極其重要的會話信息
需要使用SQL Server存儲方式
從而避免丟失重要的會話信息
但由此產生的工作負載比前兩者大得多
若不考慮狀態信息的保留和多個服務器共享
應盡量選擇保存在服務器的進程中
從而得到最佳的性能
會話狀態信息的存儲方式選擇通過nfig文件
<sessionState
mode=
InProc/StateServer/SqlServer
//存儲方式由此行選擇
stateConnectionString=
tcpip=
:
……
timeout=
/>
服務器控件的優化選擇
減少不必要的服務器控件
服務器控件帶來的方便和功能是html控件所不能比擬的
但是每一個服務器控件都需要在服務器端創建相應的對象
是以犧牲服務器端的資源為代價的
過多的使用服務器控件會極大的影響程序性能
很多情況下
簡單地使用html標記或數據綁定即能夠實現所需功能
比如<asp:Label>控件
若使用它來顯示靜態信息
則完全可用簡單的標記來實現
如果html控件達不到所要實現的功能
而且在腳本語言如javascript
vbscript也不能實現的情況下
才考慮選擇服務器控件
禁用不必要的狀態視圖
服務器控件的狀態視圖屬性能夠自動的在頁面往返過程中維護服務器控件的狀態
減少開發者的工作量
但是需要占用大量的服務器內存資源
因此
在不需要服務器控件狀態視圖的情況下
應將其EnableViewState屬性設置為false
如常用的<asp:Lable>和<asp:Button>控件
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();
}
}
以上代碼將保證只有在首次訪問該頁面時對數據庫進行讀取並綁定
合理使用DataGrid控件
DataGrid控件帶有最強大的數據顯示功能
還內置了對數據的修改
刪除
添加
分頁等很多功能
如果只需簡單的顯示數據
DataGrid並非最佳選擇
DataGrid控件的分頁功能
數據的存儲方式(存儲在viewstate中)等
雖然讓程序開發者使用方便快捷
但由此產生的性能開銷不容小視
DataList控件比DataGrid功能少了很多
但自定義性強了很多
特有的多行數據顯示還是比較方便的
DataGrid能實現的功能
它基本能實現
Repeater控件功能最少
但自定義性非常強
由於減少了很多功能
對服務器的性能帶來消耗最小
因此
在只需簡單顯示數據列表時
選擇Repeater或DataList控件同樣可以達到目的
而且減輕了性能上的開銷
數據庫訪問性能優化 數據庫的連接和關閉
訪問數據庫資源需要創建連接
打開連接和關閉連接幾個操作
這些過程需要多次與數據庫交換信息以通過身份驗證
比較耗費服務器資源
ASP
NET中提供了連接池(Connection Pool)改善打開和關閉數據庫對性能的影響
系統將用戶的數據庫連接放在連接池中
需要時取出
關閉時收回連接
等待下一次的連接請求
連接池的大小是有限的
如果在連接池達到最大限度後仍要求創建連接
必然大大影響性能
因此
在建立數據庫連接後只有在真正需要操作時才打開連接
使用完畢後馬上關閉
從而盡量減少數據庫連接打開的時間
避免出現超出連接限制的情況
使用存儲過程
存儲過程是存儲在服務器上的一組預編譯的SQL語句
類似於DOS系統中的批處理文件
存儲過程具有對數據庫立即訪問的功能
信息處理極為迅速
使用存儲過程可以避免對命令的多次編譯
在執行一次後其執行規劃就駐留在高速緩存中
以後需要時只需直接調用緩存中的二進制代碼即可
另外
存儲過程在服務器端運行
獨立於ASP
NET程序
便於修改
最重要的是它可以減少數據庫操作語句在網絡中的傳輸
優化查詢語句
ASP
NET中ADO連接消耗的資源相當大
SQL語句運行的時間越長
占用系統資源的時間也越長
因此
盡量使用優化過的SQL語句以減少執行時間
比如
不在查詢語句中包含子查詢語句
充分利用索引等
字符串操作性能優化 使用值類型的ToString方法
在連接字符串時
經常使用
+
號直接將數字添加到字符串中
這種方法雖然簡單
也可以得到正確結果
但是由於涉及到不同的數據類型
數字需要通過裝箱操作轉化為引用類型才可以添加到字符串中
但是裝箱操作對性能影響較大
因為在進行這類處理時
將在托管堆中分配一個新的對象
原有的值復制到新創建的對象中
使用值類型的ToString方法可以避免裝箱操作
從而提高應用程序性能
運用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發布的一個免費測試工具
可以從上下載
它可以模擬成百上千個用戶同時對web應用程序進行訪問請求
在服務器上形成流量負載
從而達到測試的目的
可以生成平均TTFB
平均TTLB等性能匯總報告
Application Center Test (ACT) 是一個測試工具
附帶於Visual Studio
NET的企業版中
是Microsoft正式支持的web應用程序測試工具
它能夠直觀地生成圖表結果
功能比WAS多
但不具備多個客戶機同時測試的能力
服務器操作系統
管理工具
中的
性能
計數器
可以對服務器進行監測以了解應用程序性能
結論 對於網站開發人員來說
在編寫ASP
NET應用程序時注意性能問題
養成良好的習慣
提高應用程序性能
至少可以推遲必需的硬件升級
降低網站的成本
From:http://tw.wingwit.com/Article/program/net/201311/13499.html