效能優化三大面向
ASP.NET 雖較傳統 ASP 有本質效能提升,但要達到生產級標準,仍需從頁面生命週期、資料存取、字串操作等層面深入優化。
一、頁面層級優化
1. 會話狀態選擇
| 模式 | 效能 | 擴展性 | 適用場景 |
| InProc (預設) | 最快 | 單一伺服器 | 單機、不需共享 Session |
| StateServer | 較慢 (序列化/網路) | 多機器共享 | Web Farm、需 Session 持久 |
| SQL Server | 最慢 | 高可靠、持久化 | 關鍵業務、容錯需求高 |
設定於 `web.config`:
<sessionState mode="InProc" timeout="20" />
2. 伺服器控制項取捨
- 減少不必要的伺服器控制項:靜態文字用 `` 或 Literal,勿用 `Label`。
- 關閉 ViewState:`EnableViewState="false"` 於 `Label`、`Button`、唯讀 `GridView` 等無需回發狀態的控制項。
- 善用 Page.IsPostBack:僅首次載入才執行資料繫結、昂貴運算。
void Page_Load(Object o, EventArgs e)
{
if (!Page.IsPostBack)
{
// 僅第一次執行:資料庫查詢、繫結 GridView
}
}
3. 其他頁面技巧
- 啟用頁面輸出快取:`<%@ OutputCache Duration="60" VaryByParam="none" %>`
- 使用 `StringBuilder` 取代字串串接(迴圈中)。
- 避免在 `Page_Load` 執行耗時操作,改用非同步頁面或背景工作。
二、資料存取優化
- 使用預存程序減少網路往返與編譯開銷。
- `SqlDataReader` 唯讀、前進游標,比 `DataSet`/`DataTable` 輕量得多。
- 連接池:確保連線字串一致、`using` 區塊正確釋放連線。
- 分頁查詢:`ROW_NUMBER() OVER (ORDER BY ...)` 或 `OFFSET/FETCH` (SQL 2012+),避免一次撈取大量資料。
- 適度索引、避免 `SELECT *`、參數化查詢防止 SQL Injection 並利用執行計畫快取。
三、字串處理優化
- 大量串接:`StringBuilder`(預設容量 16,可指定初始容量)。
- 格式化:`string.Format` 或 C# 6 `$""` 插值字串,避免 `+` 運算子多次配置記憶體。
- 正則表達式:靜態 `Regex` 物件並設定 `RegexOptions.Compiled` 重複使用。
- 編碼轉換:指定 `Encoding.UTF8` 避免預設編碼歧義。
監測與調校工具
- ASP.NET 追蹤:`trace.axd`、頁面指示詞 `Trace="true"`。
- 效能計數器:`ASP.NET Applications`、`ASP.NET` 類別。
- Profiler:dotTrace、Visual Studio Diagnostic Tools、PerfView。
- 迷你分析器:MiniProfiler (StackExchange) 嵌入頁面即時顯示 SQL、HTTP 請求耗時。
總結
效能優化是持續迭代過程:測量 → 找出瓶頸 → 優化 → 驗證。從架構層面(快取策略、非同步、資料庫設計)著手,效果遠大於微觀程式碼調整。