首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 網站效能優化實戰指南:程式碼習慣、資料庫、快取與架構

     編輯:ASP.NET 基礎

一、程式碼層面微優化

1. 字串操作

  • 比較空字串:str.Length == 0 或 string.IsNullOrEmpty(str) 優於 str == ""。
  • 大量串接:StringBuilder (預分配容量) 取代 +=。
  • 格式化:string.Format / $"" 可讀性佳,效能略低於 StringBuilder,非熱路徑可接受。

2. 迴圈與集合


// 差:每次迴圈取 Count 屬性 (List 尚可,IEnumerable 會重新枚舉)
for (int i = 0; i < list.Count; i++) { }

// 好:預存長度
int len = list.Count;
for (int i = 0; i < len; i++) { }

// 避免在迴圈呼叫方法 (內聯較佳)
foreach (var item in list) { DoWork(item); } // JIT 可能內聯

3. 裝箱/拆箱避免

  • 使用泛型集合 List、Dictionary 取代 ArrayList/Hashtable。
  • 介面參數加上 where T : struct 或避免 value type 傳入 object。

4. 物件建立

  • 重用物件 (物件池) 如 StringBuilder、MemoryStream、SocketAsyncEventArgs。
  • 避免在熱路徑 new 大型陣列/物件圖。

5. 例外處理

  • 不要用例外控制流程 (TryParse 取代 Try/Catch Parse)。
  • 避免在 catch 區塊重新拋出 throw ex; (會重設堆疊),用 throw;。

二、ASP.NET 特定優化

項目建議影響
ViewState 不需要的控制項 EnableViewState="false";整頁關閉或改用 Session/ClientState 減少頁面大小 20-50%
Server.Transfer vs Response.Redirect 同站內跳轉用 Server.Transfer (避免 302 往返),但 URL 不變、瀏覽器歷史不同步 少一次 HTTP 往返
控制項選擇 Repeater > ListView > GridView/DataList (輸出最輕量) Render 時間、ViewState 大小
輸出快取 <%@ OutputCache Duration="60" VaryByParam="id" %> 靜態/半靜態頁 CPU 大幅下降
資料快取 MemoryCache / Redis 快取熱門查詢、字典表 DB 壓力降低 80%+
壓縮 IIS 動態/靜態壓縮 (gzip/deflate/br) 傳輸量 -70%
Client 端快取 靜態資源 Cache-Control: max-age=31536000 + 指紋版本 回訪零請求

三、資料庫效能優化

1. 連線管理

  • using (var cn = new SqlConnection(cs)) { cn.Open(); ... } 確保釋放。
  • 連線字串調大 Pool:Max Pool Size=512; Min Pool Size=10; (高併發)。
  • 避免長時間持有連線 (跨網路呼叫、大量運算在連線外完成)。

2. SQL 查詢優化

  • 避免 SELECT *:只取需要欄位,減少網路/IO/記憶體。
  • 索引策略:WHERE/JOIN/ORDER BY 欄位建立索引;覆蓋索引避免 Key Lookup。
  • 參數化查詢:防注入 + 計畫重用。
  • 分頁:OFFSET/FETCH (SQL 2012+) 或 ROW_NUMBER。
  • 避免 N+1:單查詢 JOIN 或批次載入取代迴圈查詢。

3. DataReader 最佳讀取模式

// 最快:序數 + 強型別 Get 方法
int ordId = reader.GetOrdinal("Id");
int ordName = reader.GetOrdinal("Name");
while (reader.Read())
{
    int id = reader.GetInt32(ordId);
    string name = reader.GetString(ordName);
    // ...
}
reader.Close();

效能排序:GetInt32(ord) > GetInt32("Name") > reader["Name"] > reader[0] (後兩者需查找/裝箱)。

4. 非同步資料庫存取 (ASP.NET 4.5+)


public async Task> GetProductsAsync()
{
    using (var cn = new SqlConnection(cs))
    using (var cmd = new SqlCommand(sql, cn))
    {
        await cn.OpenAsync();
        using (var reader = await cmd.ExecuteReaderAsync())
        {
            var list = new List();
            while (await reader.ReadAsync())
                list.Add(Map(reader));
            return list;
        }
    }
}

釋放執行緒處理更多並發請求,提升吞吐量。

四、架構層面優化

  1. CDN:靜態資源 (圖片、CSS、JS、字型) 卸載至 CDN。
  2. 非同步處理:耗時作業 (匯出、寄信、影片轉碼) 丟入 Hangfire/Quartz/Message Queue,立即回應使用者。
  3. 讀寫分離:Master 寫入、Slave 讀取 (報表、查詢)。
  4. 微服務拆分:核心交易、商品、會員、訂單獨立部署、獨立擴展。
  5. 監控與自動擴展:APM (Application Insights/New Relic) + K8s HPA / VM Scale Set。

五、效能測試與基準建立

  • 工具:JMeter、k6、NBomber、VS Load Test。
  • 指標:RPS (Requests/sec)、P95/P99 Latency、Error Rate、CPU/Memory/DB DTU。
  • 基準:優化前/後對比,單一變因實驗。

六、快速檢查清單 (部署前)

[ ] 移除 Debug="true" (web.config compilation)
[ ] 啟用 IIS 動態/靜態壓縮
[ ] 靜態資源設定長效快取 + 版本指紋
[ ] 關閉不需要的 ViewState
[ ] 關鍵查詢加上索引、避免 SELECT *
[ ] 連線字串 Max Pool Size 適當調大
[ ] 熱門資料加入 MemoryCache/Redis
[ ] 大檔案下載用 TransmitFile/FileStreamResult
[ ] 錯誤頁面不洩露堆疊資訊 (customErrors mode="RemoteOnly")
[ ] 啟用 HSTS、CSP、X-Frame-Options 等安全標頭
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved