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

.NET 效能優化 11 大實戰技巧:避免裝箱、字串處理、集合選擇、異常處理

     編輯:關於C語言

前言

.NET 應用效能優化往往在細節。本文彙整 11 個實戰優化技巧,涵蓋集合選擇、字串操作、XML 處理、迴圈優化、異常處理、資源釋放、快取策略等核心領域,助你寫出高效能代碼。

1. 避免使用 ArrayList —— 改用泛型集合

問題:ArrayList 存儲 object,值類型存入需裝箱,取出需拆箱,產生額外記憶體配置與 GC 壓力。

解決:.NET 2.0+ 使用泛型集合 List<T>、Dictionary<TKey, TValue> 等,強類型、無裝箱拆箱。

// 避免
ArrayList list = new ArrayList();
list.Add(100); // 裝箱
int i = (int)list[0]; // 拆箱

// 推薦
List list = new List();
list.Add(100); // 無裝箱
int i = list[0]; // 無拆箱

2. 優先使用 Hashtable / Dictionary 替代其他字典類型

Hashtable、Dictionary<TKey, TValue> 經過高度優化,查找效能優於 StringDictionary、NameValueCollection、HybridDictionary。小量資料亦適用。

3. 字串常數化 —— 避免重複字面值

// 避免:每次建立新字串物件
obj.Status = "ACTIVE";

// 推薦:編譯期常數,單一物件
const string C_STATUS = "ACTIVE";
obj.Status = C_STATUS;

4. 字串比較用 String.Compare 忽略大小寫

// 避免:建立兩個新字串(ToUpper/ToLower)
if (sVariable.ToUpper() == "COMPARE") ...

// 推薦:直接比較,忽略大小寫
const string C_VALUE = "COMPARE";
if (String.Compare(sVariable, C_VALUE, true) == 0) // true = ignoreCase
    Console.WriteLine("SAME");

5. 字串串接用 StringBuilder

// 避免:每次串接產生新字串,O(n²) 複雜度
string sXML = "";
sXML += "";
sXML += "Data";
sXML += "";

// 推薦:StringBuilder 可變緩衝區,O(n)
StringBuilder sb = new StringBuilder();
sb.Append("");
sb.Append("");
sb.Append("Data");
sb.Append("");
string result = sb.ToString();

6. 唯讀 XML 用 XPathDocument 替代 XmlDocument

// 避免:XmlDocument 建立完整 DOM 樹,記憶體佔用大
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
string name = doc.SelectSingleNode("/packet/child").InnerText;

// 推薦:XPathDocument 唯讀、流式、記憶體效率高
XPathDocument xpDoc = new XPathDocument(new StringReader(xmlString));
XPathNavigator nav = xpDoc.CreateNavigator();
XPathNodeIterator iter = nav.Select("packet/child");
while (iter.MoveNext())
    Console.WriteLine(iter.Current.Value);

7. 迴圈外宣告變數,迴圈內初始化

// 避免:每次迴圈重新配置區域變數空間(雖 JIT 可能優化,但語意不清)
for (int i = 0; i < 10; i++)
{
    SomeClass obj = new SomeClass();
    // ...
}

// 推薦:語意清晰,避免誤解
SomeClass obj = null;
for (int i = 0; i < 10; i++)
{
    obj = new SomeClass();
    // ...
}

8. 捕捉具體例外類型,避免捕捉 System.Exception

// 避免:吞沒所有例外,隱藏真實錯誤
try { ... }
catch (Exception ex) { ... }

// 推薦:精準處理預期例外
try { ... }
catch (NullReferenceException ex) { ... }
catch (ArgumentOutOfRangeException ex) { ... }
catch (InvalidCastException ex) { ... }

9. Try-Catch-Finally 確保資源釋放

SqlConnection conn = null;
try
{
    conn = new SqlConnection(connStr);
    conn.Open();
    // ...
}
catch (Exception ex)
{
    // 錯誤處理
}
finally
{
    if (conn != null) conn.Close(); // 或 conn.Dispose()
    // 更佳:using 區塊自動釋放
}

最佳實務:實作 IDisposable 的物件一律用 using 區塊。

10. 避免遞迴與巢狀迴圈

  • 遞迴:堆疊溢位風險、函數呼叫開銷大
  • 巢狀迴圈:時間複雜度指數級增長
  • 必要時:改用迭代、演算法優化(如雜湊查找替代雙層迴圈)、平行處理

11. 善用快取策略

  • 記憶體快取:MemoryCache、IMemoryCache(ASP.NET Core)
  • 分散式快取:Redis、NCache
  • 輸出快取:頁面/片段快取
  • 資料庫查詢快取:查詢結果快取、實體框架二級快取

總結

效能優化無銀彈,但這 11 項技巧涵蓋了 .NET 應用 80% 以上的常見效能陷阱。建議:

  1. 先用分析工具(Profiler、dotTrace、PerfView)定位熱點
  2. 針對熱點套用對應優化
  3. 驗證優化前後效能指標
  4. 建立團隊編碼規範,預防常見問題
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved