只有累積,沒有奇蹟

2022年11月28日 星期一

[Benchmark] String 比較字串效能分析

前言
在 .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 的測試代碼如下
[Benchmark]
public void EqualString()
{
    if (string1.Equals(string2)) ;
}
使用 string.Compare 比對 string 的方式如下
[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 進行測試
測試完成後,會產生測試報各路徑在  release\BenchmarkDotNet.Artifacts\results  目錄底下,如下圖所示
根據測試結果
  • .NET Framework : 表現最差的為 IndexOf,表現最好的是 string.CompareOrdinal
  • .NET Core : 同樣表現最差的為 IndexOf,表現最好的是 string.CompareOrdinal

  • 感想
    透過結果得知,在 .NET Framework 與 .NET Core 環境中在字串比較上,效能最好的是 string.CompareOrdinal,== 與 string.Equals 緊追在後,IndexOf 則是在 .NET Framework 與 .NET Core 都墊底,另外在微軟 MSDN 在 .NET 中比較字串 文章中也有介紹常見的字串比對,有特別強調 CompareOrdinal 主要是用於排序或字串排序時。 不應該使用 String.CompareOrdinal 方法來測試是否相等
    得到最後的結論 compareOrdinal 雖然快,但 若要判斷兩個字串是否相等,請使用 String.Equals ,另外文章列出的 String.StartsWith、String.EndsWith 在本次比較中並未列出,原因是個人覺得在情境上與其他出發點不同,若是想了解更多各位客官也可自行測試看看,以上就是比較字串的結果,Happy Coding :)

    0 意見:

    張貼留言

    Copyright © m@rcus 學習筆記 | Powered by Blogger

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com