Web 應用程式效能優化無銀彈,但有系統性方法論。本文基於微软 ASP.NET 團隊實務經驗,從**大優化 (架構層級)** 與 **小優化 (代碼細節)** 雙軌並進,涵蓋資料層存取、快取策略、ViewState 控制、分頁查詢、非同步模式、分散式部署考量,提供可落地的優化清單。
-- 預存程序一次回傳 3 個結果集
CREATE PROC GetDashboardData @UserId INT
AS
SELECT * FROM Orders WHERE UserId = @UserId; -- 結果集 1
SELECT * FROM Notifications WHERE UserId = @UserId; -- 結果集 2
SELECT * FROM Preferences WHERE UserId = @UserId; -- 結果集 3
// C# 一次往返讀取三組資料
using (var reader = cmd.ExecuteReader())
{
var orders = ReadOrders(reader);
reader.NextResult();
var notifications = ReadNotifications(reader);
reader.NextResult();
var preferences = ReadPreferences(reader);
}
| 設定 | 建議值 | 說明 |
|---|---|---|
| Min Pool Size | 核心數 × 2 ~ 4 | 預熱連線,避免冷啟動延遲 |
| Max Pool Size | 100-200 (視 DB 最大連線數) | 防止連線耗盡 |
| Connection Lifetime | 300-600 秒 | 定期回收避免殭屍連線 |
| Enlist=false | 非分散式交易時 | 略過 DTC 開銷 |
-- SQL Server 2012+ OFFSET FETCH (標準、可讀)
SELECT * FROM Products
ORDER BY ProductID
OFFSET @PageSize * (@PageIndex - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY;
-- 舊版 ROW_NUMBER() 相容寫法
WITH Paged AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY ProductID) AS RN
FROM Products
)
SELECT * FROM Paged WHERE RN BETWEEN @Start AND @End;
| 層級 | 範圍 | 適用場景 | 技術 |
|---|---|---|---|
| **輸出快取** | 頁面/使用者控制項 | 靜態內容、公共頁面片段 | `<%@ OutputCache %>` / `Response.Cache` |
| **資料快取** | 應用程式域 | 熱門商品、分類樹、設定檔 | `Cache.Insert` / `MemoryCache` |
| **分散式快取** | 叢集/多伺服器 | Session、購物車、Token、排行榜 | Redis / NCache / SQL Server Cache |
| **CDN/瀏覽器快取** | 邊緣/客戶端 | 靜態資源 (JS/CSS/圖片/字體) | `Cache-Control`、ETag、版本化 URL |
// ASP.NET 4.5+ Task-based 非同步 Page
public async Task Page_LoadAsync()
{
var userTask = UserService.GetProfileAsync(userId);
var ordersTask = OrderService.GetRecentAsync(userId);
var prefsTask = PrefService.GetAsync(userId);
await Task.WhenAll(userTask, ordersTask, prefsTask); // 平行等待
// 綁定 UI
}
「分散式部署 (Web Services/Remoting) 會使效能下降 20%+,除非必要,盡量同進程部署。」
| 架構 | 優點 | 缺點 | 建議 |
|---|---|---|---|
| 單體 (Monolith) | 零序列化、共用記憶體、簡單 | 擴展性受限、技術棧鎖定 | 中小型專案首選 |
| 模組化單體 | 邏輯分層、可獨立測試、未來易拆分 | 仍單一進程 | 推薦架構 |
| 微服務 | 獨立部署、技術異構、團隊自治 | 網路延遲、分散式複雜度、資料一致性 | 大型組織、高擴展需求 |
**資料庫永遠獨立部署** (專用伺服器),應用層視規模決定。
1. 架構正確 (單體 vs 分散式、資料庫獨立) 2. 資料層優化 (索引、分頁、批次、SP、連線池) 3. 快取策略 (多層級、相依性、一致性) 4. 非同步 I/O (釋放執行緒、提升併發) 5. ViewState/頁面大小控制 6. 代碼層級微優化 (StringBuilder、迴圈、配置) 7. 前端優化 (壓縮、合併、CDN、圖片) 8. 持續監控、基準測試、自動化回歸
效能優化是**系統工程**,非單點技巧。建立「量測 → 分析 → 優化 → 驗證 → 監控」閉環,將優化納入 CI/CD 流程 (效能預算、自動化負載測試),才能讓應用程式在演進中持續保持高效能。