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

.NET 深度學習筆記 (2):C# 判斷空字串 4 種方法效能實測與 IL 深度剖析

     編輯:關於.NET

判斷字串是否為空是日常開發最高頻操作之一。網路上流傳「用 Length == 0 最快」的結論,但缺乏嚴謹測試與原理分析。本文設計科學實驗、實測效能數據、反編譯 IL 解析根本原因,給出有理有據的最佳實踐建議。

實驗環境與方法論

項目規格
CPUIntel T2300 1.66GHz (雙核心)
記憶體Kingston DDR2 667 1GB
OSWindows XP Professional
IDEVisual Studio 2008 RTM
測試模式Release 建置、無偵錯器附著
迴圈次數1,000,000 次 (100 萬)
測試字串空字串、String.Empty、非空字串 "StringNotEmpty"

四種判斷方法對照

// 方法 1: Length 比較
bool result = (str.Length == 0);

// 方法 2: 靜態比較 String.Empty
bool result = (str == String.Empty);

// 方法 3: 字面常數比較
bool result = (str == "");

// 方法 4: 靜態方法
bool result = String.IsNullOrEmpty(str);

實測結果數據 (毫秒)

測試字串Length==0==String.Empty== ""IsNullOrEmpty
空字串 ("")2109 / 2406 / 2156296 / 406 / 218296 / 406 / 218穩定 ~300
String.Empty2109 / 2406 / 2156296 / 406 / 218296 / 406 / 218穩定 ~300
非空字串2109 / 2406 / 2156296 / 406 / 218296 / 406 / 218穩定 ~300

效能測試結果圖表

驚人發現:Length == 0 最慢?IL 揭示真相

關鍵 IL 片段對比

// == String.Empty (ldsfld - 靜態欄位載入)
IL_0010: ldsfld string [mscorlib]System.String::Empty
IL_0015: call bool [mscorlib]System.String::op_Equality(string, string)

// == "" (ldstr - 字面常數載入)  
IL_0012: ldstr ""
IL_0017: call bool [mscorlib]System.String::op_Equality(string, string)

// Length == 0 (callvirt 實例屬性存取)
IL_0020: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_0025: ldc.i4.0
IL_0026: ceq

根本原因分析

指令語意開銷
ldsfld載入靜態欄位位址 (String.Empty 為單一共享實例)極低:單一記憶體讀取
ldstr載入字面常數 (模組中繼資料區,同樣共享)極低:同樣單一記憶體讀取
callvirt get_Length虛擬呼叫實例屬性 getter (需 null 檢查、查虛擬表)較高:方法呼叫開銷 + null 檢查

結論:Length == 0 涉及虛擬方法呼叫,而 == String.Empty 和 == "" 只是載入已存在的參考位址進行位址比較 (或經過字串內容比較優化),後者顯著更快。

String.IsNullOrEmpty 實作原理

public static bool IsNullOrEmpty(string value)
{
    return value == null || value.Length == 0;
}
// 內部仍用 Length == 0,但增加 null 保護

效能介於兩者之間,穩定性最好 (不拋 NullReferenceException)。

最佳實踐建議

  1. 一般情況:str == "" 或 str == String.Empty (語意更清晰)
  2. 可能為 null:String.IsNullOrEmpty(str) (安全第一)
  3. .NET Core 2.0+ / .NET 5+:String.IsNullOrWhiteSpace(str) 同時檢查空白字元
  4. 極致效能熱點路徑:str.Length == 0 配合 if (str != null) 手動 null 檢查 (極少見必要)

補充:字串驻留 (String Interning) 影響

  • "" 和 String.Empty 編譯期指向同一個駐留字串實例
  • ldstr 和 ldsfld 實際載入相同位址
  • 參考相等性比較 (== 經運算子多載) 極快,JIT 可能進一步內聯優化

效能優化必須建立在實測數據與原理理解之上,而非道聽塗說。這個簡單測試揭示了「直覺最快」往往不是真相的經典案例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved