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