只有累積,沒有奇蹟

2022年11月28日 星期一

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

前言
在 .NET 開發時很常會用到字串的比對,C# 中提供多種字串比對的方式,這篇文章就列出在 C# 提供的字串比方法,針對這幾種常用的方法使用  BenchmarkDotNet  做效能的測試及比對並會在 .NET Framework 與 .NET Core 分別測試結果,若有問題或是錯誤的地方歡迎各位給予指導及討論

測試代碼 
測試使用  BenchmarkDotNet  進行測試的動作,如果沒聽過此套件可以參考介紹的文章 [.NETCore] 使用 BenchmarkDotNet 測試程式碼效能,這次測試的項目是字串的比對方式效能差異,另外在 stringBenchmark 類別加上  ClrJob,CoreJob  希望分別在 .NET Framework 與 .NET Core 測試效能差異,代碼如下 
  1. namespace benchmarkLab
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. var summary = BenchmarkRunner.Run<stringCompareBenchmark>();
  8. Console.ReadKey();
  9. }
  10. }
  11.  
  12. [MemoryDiagnoser]
  13. [ClrJob,CoreJob]
  14. public class stringCompareBenchmark
  15. {
  16. public string string1 = "i am iron man";
  17. public string string2 = "I AM IRON MAN";
  18.  
  19. // 測試代碼
  20. }
  21. }
使用 Benchmark 測試數據,需要在方法上加上 Benchmark,使用 string 的比對測試的代碼如下
  1. [Benchmark]
  2. public void EqualityString()
  3. {
  4. if (string1 == string2) ;
  5. }
使用 string.Equals 的測試代碼如下
  1. [Benchmark]
  2. public void EqualString()
  3. {
  4. if (string1.Equals(string2)) ;
  5. }
使用 string.Compare 比對 string 的方式如下
  1. [Benchmark]
  2. public void CompareString()
  3. {
  4. if (string.Compare(string1, string2) == 0) ;
  5. }
使用 string.CompareOrdinal,測試的代碼如下
  1. [Benchmark]
  2. public void CompareOrdinalString()
  3. {
  4. if (string.CompareOrdinal(string1, string2) == 0) ;
  5. }
使用 string.compareTo,測試的代碼如下
  1. [Benchmark]
  2. public void CompareToString()
  3. {
  4. if (string1.CompareTo(string2) == 0) ;
  5. }
使用 string.Concat,測試的代碼如下
  1. [Benchmark]
  2. public void Concat()
  3. {
  4. string s = string.Empty;
  5. s = string.Concat(firstWord, secondWord);
  6. }
也可以使用 indexOf 方法找,因此也一併列出看看測試效能測試的代碼如下
  1. [Benchmark]
  2. public void IndexOfString()
  3. {
  4. if (string1.IndexOf(string2) == 0) ;
  5. }
接著調整到 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 :)

    Related Posts:

    • [NETCore] 使用 Try.NET 建立互動文件 前言 Try.NET 是微軟公布的 open source 互動式文件產生器,可以在網頁上嵌入 .NET 代碼 (目前僅支援 C# 語法),讓閱讀的開發者可以直接在瀏覽器閱讀代碼時直接執行或編輯,也有整合 GitHub Gists 等工具,這篇簡單介紹關於 Try.NET 的介紹與基本應用,若有問題或是錯誤的地方歡迎網路的高手大大給予指導。 Try.NET Online Try.NET 目前線上版在可以在 MSDN 的 執行您的第一個… Read More
    • [.NETCore] ASP.Net Core 使用 Big5 中文編碼 問題 在 .NET Framework 時要取得中文編碼可以使用  Encoding.GetEncoding("BIG5"),今天在練習專案時遇到類似的情境很直覺的在將 Code 套用在 .NET Core 上,沒想到竟然發生錯誤,這邊簡單紀錄遇到這問題該怎麼解決以及根本原因,有任何問題歡迎留言一起討論 解決方式  "ArgumentException: 'Big5' is not a support… Read More
    • [C#] 在 C# 使用 HMAC - SHA256 加密前言 最近工作上跟第三方服務串接時用到 HMAC - SHA256 加密方式,過去大多是使用 MD5 或是 SHA-256 加密但 HMAC 沒接觸過小研究了一番,HMAC 全名是 Hash-based message authentication code,是一種金鑰式雜湊演算法,可以結合加密金鑰 (key) 進行加密最後輸出 64 字元的內容,對於演算法內容想了解更多可以參考 wiki : 傳送門,這裡就紀錄在 C# 中如… Read More
    • [WEBAPI] 如何設定 Swagger 為預設首頁 Start Page問題 自己不管是在開發 .NET Framework 或是 .NET Core 專案,只要遇到是 Web API 專案都會安裝 Swagger 來協助測試 API 的動作,只要使用過 Swagger 的開發者都知道啟動專案後第一件事就是要在開啟的頁面網址加上 Swagger,接著在繼續透過 Swagger 頁面進行 API 測試的動作,但每次開啟時就需要在網址上輸入一次也是頗麻煩的,今天就來分享兩種方式可以起始頁面為 swagger 頁面,若有問… Read More
    • [NET] 檢查字串是否為 Json 格式前言 在開發時很常使用到 Json 格式作為設定檔,舉例來說在 ASP.NET Core 設定檔預設也是使用 Json 格式,系統開發中也會將一些常用的設定放在 Json 方便調整,在 ASP.NET 讀取 Json 最常用到的是 Json.Net 套件,使用上可以很方便地將字串轉為定義的類別內容,這篇就來分享怎麼用 Json.net 來判斷要轉換的文字字串是否為 Json 格式,若有問題歡迎留言一起討論。 代碼 首先先下載 Json.Ne… Read More

    0 意見:

    張貼留言

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

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com