在 .NET 開發時很常會用到字串的比對,C# 中提供多種字串比對的方式,這篇文章就列出在 C# 提供的字串比方法,針對這幾種常用的方法使用 BenchmarkDotNet 做效能的測試及比對,並會在 .NET Framework 與 .NET Core 分別測試結果,若有問題或是錯誤的地方歡迎各位給予指導及討論。
測試代碼
測試使用 BenchmarkDotNet 進行測試的動作,如果沒聽過此套件可以參考介紹的文章 [.NETCore] 使用 BenchmarkDotNet 測試程式碼效能,這次測試的項目是字串的比對方式效能差異,另外在 stringBenchmark 類別加上 ClrJob,CoreJob 希望分別在 .NET Framework 與 .NET Core 測試效能差異,代碼如下
使用 Benchmark 測試數據,需要在方法上加上 Benchmark,使用 string 的比對測試的代碼如下
- namespace benchmarkLab
- {
- class Program
- {
- static void Main(string[] args)
- {
- var summary = BenchmarkRunner.Run<stringCompareBenchmark>();
- Console.ReadKey();
- }
- }
- [MemoryDiagnoser]
- [ClrJob,CoreJob]
- public class stringCompareBenchmark
- {
- public string string1 = "i am iron man";
- public string string2 = "I AM IRON MAN";
- // 測試代碼
- }
- }
- [Benchmark]
- public void EqualityString()
- {
- if (string1 == string2) ;
- }
使用 string.Equals 的測試代碼如下
使用 string.Compare 比對 string 的方式如下
測試完成後,會產生測試報各路徑在 release\BenchmarkDotNet.Artifacts\results 目錄底下,如下圖所示
根據測試結果
.NET Framework : 表現最差的為 IndexOf,表現最好的是 string.CompareOrdinal
.NET Core : 同樣表現最差的為 IndexOf,表現最好的是 string.CompareOrdinal
- [Benchmark]
- public void EqualString()
- {
- if (string1.Equals(string2)) ;
- }
使用 string.CompareOrdinal,測試的代碼如下
- [Benchmark]
- public void CompareString()
- {
- if (string.Compare(string1, string2) == 0) ;
- }
使用 string.compareTo,測試的代碼如下
- [Benchmark]
- public void CompareOrdinalString()
- {
- if (string.CompareOrdinal(string1, string2) == 0) ;
- }
使用 string.Concat,測試的代碼如下
- [Benchmark]
- public void CompareToString()
- {
- if (string1.CompareTo(string2) == 0) ;
- }
也可以使用 indexOf 方法找,因此也一併列出看看測試效能,測試的代碼如下
- [Benchmark]
- public void Concat()
- {
- string s = string.Empty;
- s = string.Concat(firstWord, secondWord);
- }
接著調整到 Release mode,按下 F5 進行測試
- [Benchmark]
- public void IndexOfString()
- {
- if (string1.IndexOf(string2) == 0) ;
- }
根據測試結果
感想
得到最後的結論 compareOrdinal 雖然快,但 若要判斷兩個字串是否相等,請使用 String.Equals ,另外文章列出的 String.StartsWith、String.EndsWith 在本次比較中並未列出,原因是個人覺得在情境上與其他出發點不同,若是想了解更多各位客官也可自行測試看看,以上就是比較字串的結果,Happy Coding :)
0 意見:
張貼留言