寫的一篇關於字符串為空判斷方法的性能分析文章,實驗結果作者已經給出,結論是使用.length==0判斷的效率最高,但是文章的結尾只有一句話,感覺不夠詳細,所以自己寫下這個文章,算一個補充和學習吧.
程序代碼執行的硬件環境:
CPU Intel T2300 1.66GHz 內存 Kingston DDR2 667 1G 硬盤 80G 5400轉 8m
測試的軟件環境:
OS Windows XP Pro IDE VS 2008 RTM
測試的代碼如下:
定義了3個變量,分別調用4種方法,進行100w次判斷,記錄測試
代碼的運行結果如下:
結果分析來看,調用string的length==0作比較,不論字符串是否為空,此方法的效率最高,此點與清清月兒的結果一致;
string的isNullOrEmpty()方法的效率基本不變,無論字符串是否有值;
== string.Empty和== ""兩種方法在3個變量測試的實驗中效率相對較低,但是兩者再和對方比較的時候會出現效率降低的情況,見上圖;
原因是什麼呢?我們來看看對應的il代碼:
1.locals init ([0] class [System]System.Diagnostics.Stopwatch sw,
2 [1] string sEmpty1,
3 [2] string sEmpty2,
4 [3] string sEmpty3,
5 [4] int32 i,
6 [5] bool CS$4$0000)
7 IL_0000: nop
8 IL_0001: newobj instance void [System]System.Diagnostics.Stopwatch::.ctor()
9 IL_0006: stloc.0
10 IL_0007: ldsfld string [mscorlib]System.String::Empty//將指定字段的值推送到堆棧上。 ldsfld 指令將靜態(在類的所有實例中共享)字段的值推送到堆棧上。返回類型是與傳遞的元數據標記 field 關聯的類型。
11
12 IL_000c: stloc.1
13 IL_000d: ldstr ""//將對字符串的對象引用推送到堆棧上,ldstr 指令推送對表示在元數據中存儲的特定字符串的新字符串對象的對象引用(O 類型)。
14 IL_0012: stloc.2
15 IL_0013: ldstr "StringNotEmpty"//將對字符串的對象引用推送到堆棧上,ldstr 指令推送對表示在元數據中存儲的特定字符串的新字符串對象的對象引用(O 類型)。
16 IL_0018: stloc.3
17 IL_0019: ldloc.0
18
兩者的差別由於推送到堆棧上的內容不同,前者是靜態共享值推送到堆棧,後者是字符串對象的地址推送到堆棧.