亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#中字符串拼接方式及其性能分析對比

 更新時間:2024年12月23日 08:37:53   作者:追逐時光者  
在C#編程中字符串拼接是一種常見且基礎的操作,廣泛應用于各種場景,如動態(tài)生成SQL查詢,構建日志信息等,本文為大家整理了C#中字符串拼接的常見6種方式及其使用BenchmarkDotNet進行性能分析對比,需要的可以參考下

前言

在C#編程中字符串拼接是一種常見且基礎的操作,廣泛應用于各種場景,如動態(tài)生成SQL查詢、構建日志信息、格式化用戶顯示內容等。然而,不同的字符串拼接方式在性能和內存使用上可能存在顯著差異。今天咱們一起來看看在C#中字符串拼接的常見6種方式及其使用BenchmarkDotNet進行性能分析對比。

BenchmarkDotNet

BenchmarkDotNet是一個基于.NET開源、功能全面、易于使用的性能基準測試框架,它為.NET開發(fā)者提供了強大的性能評估和優(yōu)化能力。通過自動化測試、多平臺支持、高級統(tǒng)計分析和自定義配置等特性,BenchmarkDotNet幫助開發(fā)者更好地理解和優(yōu)化軟件系統(tǒng)的性能表現(xiàn)。

使用教程詳細介紹:使用BenchmarkDotNet對.NET代碼進行性能基準測試

拼接基礎數(shù)據(jù)

private const int IterationCount = 1000;
private const string StringPart1 = "追逐時光者";
private const string StringPart2 = "DotNetGuide";
private const string StringPart3 = "DotNetGuide技術社區(qū)";
private readonly string[] _stringPartsArray = { "追逐時光者", "DotNetGuide", "DotNetGuide技術社區(qū)" };

+操作符

        /// <summary>
        /// 使用 + 操作符拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string PlusOperator()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += StringPart1 + " " + StringPart2 + " " + StringPart3;
            }
            return result;
        }

$內插字符串

        /// <summary>
        /// 使用 $ 內插字符串拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string InterpolatedString()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += $"{StringPart1} {StringPart2} {StringPart3}";
            }
            return result;
        }

String.Format

        /// <summary>
        /// 使用string.Format()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringFormat()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += string.Format("{0} {1} {2}", StringPart1, StringPart2, StringPart3);
            }
            return result;
        }

String.Concat

        /// <summary>
        /// 使用string.Concat()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringConcat()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += string.Concat(StringPart1, " ", StringPart2, " ", StringPart3);
            }
            return result;
        }

String.Join

        /// <summary>
        /// 使用string.Join()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringJoin()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += string.Join(" ", _stringPartsArray);
            }
            return result;
        }

StringBuilder

        /// <summary>
        /// 使用StringBuilder拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringBuilder()
        {
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < IterationCount; i++)
            {
                stringBuilder.Append(StringPart1);
                stringBuilder.Append(" ");
                stringBuilder.Append(StringPart2);
                stringBuilder.Append(" ");
                stringBuilder.Append(StringPart3);
            }
            return stringBuilder.ToString();
        }

性能基準對比測試完整代碼

    [MemoryDiagnoser]//記錄內存分配情況
    public class StringConcatenationBenchmark
    {
        private const int IterationCount = 1000;
        private const string StringPart1 = "追逐時光者";
        private const string StringPart2 = "DotNetGuide";
        private const string StringPart3 = "DotNetGuide技術社區(qū)";
        private readonly string[] _stringPartsArray = { "追逐時光者", "DotNetGuide", "DotNetGuide技術社區(qū)" };

        /// <summary>
        /// 使用 + 操作符拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string PlusOperator()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += StringPart1 + " " + StringPart2 + " " + StringPart3;
            }
            return result;
        }

        /// <summary>
        /// 使用 $ 內插字符串拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string InterpolatedString()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += $"{StringPart1} {StringPart2} {StringPart3}";
            }
            return result;
        }

        /// <summary>
        /// 使用string.Format()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringFormat()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += string.Format("{0} {1} {2}", StringPart1, StringPart2, StringPart3);
            }
            return result;
        }

        /// <summary>
        /// 使用string.Concat()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringConcat()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += string.Concat(StringPart1, " ", StringPart2, " ", StringPart3);
            }
            return result;
        }

        /// <summary>
        /// 使用string.Join()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringJoin()
        {
            string result = string.Empty;
            for (int i = 0; i < IterationCount; i++)
            {
                result += string.Join(" ", _stringPartsArray);
            }
            return result;
        }

        /// <summary>
        /// 使用StringBuilder拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringBuilder()
        {
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < IterationCount; i++)
            {
                stringBuilder.Append(StringPart1);
                stringBuilder.Append(" ");
                stringBuilder.Append(StringPart2);
                stringBuilder.Append(" ");
                stringBuilder.Append(StringPart3);
            }
            return stringBuilder.ToString();
        }
    }

性能基準對比測試分析報告

MethodMeanErrorStdDevGen0Gen1Allocated
PlusOperator2,066.28 us35.761 us63.566 us5238.2813789.062532283.12 KB
InterpolatedString1,984.56 us29.949 us28.014 us5238.2813789.062532283.12 KB
StringFormat2,112.02 us25.020 us23.404 us5257.8125777.343832369.06 KB
StringConcat2,027.09 us28.300 us26.472 us5257.8125777.343832369.06 KB
StringJoin2,017.36 us27.111 us22.639 us5257.8125777.343832369.06 KB
StringBuilder13.63 us0.065 us0.058 us23.25444.6387143.96 KB

說明:

  • Mean: 所有測量值的算術平均值。
  • Error: 99.9% 置信區(qū)間的一半。
  • StdDev: 所有測量值的標準差。
  • Gen0: 第 0 代 GC 每 1000 次操作收集一次。
  • Gen1: 第 1 代 GC 每 1000 次操作收集一次。
  • Gen2: 第 2 代 GC 每 1000 次操作收集一次。
  • Allocated: 每次操作分配的內存(僅托管內存,包含所有內容,1KB = 1024B)。
  • 1 ms: 1 毫秒(0.001 秒)。

性能基準對比測試結論

從上面的性能基準對比測試分析報告來看StringBuilder是性能最好的字符串拼接方式,特別是在需要頻繁進行拼接的場景中。其他方式(如+操作符$內插字符串、String.FormatString.ConcatString.Join)在性能上相對較差,因為它們會導致多次內存分配和復制。

因此我們在選擇字符串拼接方式時,應該根據(jù)具體場景和需求進行選擇。如果性能是關鍵因素,并且需要頻繁進行拼接,則應使用StringBuilder。如果代碼簡潔性和易讀性更重要,并且拼接次數(shù)較少,則可以考慮使用其他方式。

以上就是C#中字符串拼接方式及其性能分析對比的詳細內容,更多關于C#字符串拼接的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解C#泛型的類型參數(shù)約束

    詳解C#泛型的類型參數(shù)約束

    這篇文章主要介紹了C#泛型的類型參數(shù)約束的相關資料,文中講解非常細致,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下
    2020-07-07
  • C#利用接口實現(xiàn)多語種選擇功能

    C#利用接口實現(xiàn)多語種選擇功能

    這篇文章主要為大家詳細介紹了如何C#利用接口實現(xiàn)多語種選擇功能,即多語言切換的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2024-02-02
  • C#如何消除驗證碼圖片的鋸齒效果

    C#如何消除驗證碼圖片的鋸齒效果

    這篇文章主要為大家詳細介紹了C#如何消除驗證碼圖片的鋸齒效果,有無鋸齒主要依靠一句代碼,想要知道的朋友可閱讀下文
    2016-09-09
  • MessageBox的Buttons和三級聯(lián)動效果

    MessageBox的Buttons和三級聯(lián)動效果

    這篇文章主要介紹了MessageBox的Buttons和三級聯(lián)動的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • WinForm調用jar包的方法分析

    WinForm調用jar包的方法分析

    這篇文章主要介紹了WinForm調用jar包的方法,結合實例形式分析了WinForm調用jar包的原理、實現(xiàn)技巧與相關注意事項,需要的朋友可以參考下
    2017-05-05
  • C#利用VS中插件打包并發(fā)布winfrom程序

    C#利用VS中插件打包并發(fā)布winfrom程序

    這篇文章主要為大家詳細介紹了C#利用VS中插件打包并發(fā)布winfrom程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • C#程序調用C++動態(tài)庫(dll文件)遇到的坑及解決

    C#程序調用C++動態(tài)庫(dll文件)遇到的坑及解決

    這篇文章主要介紹了C#程序調用C++動態(tài)庫(dll文件)遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C# WinForm實現(xiàn)自動更新程序之客戶端的示例代碼

    C# WinForm實現(xiàn)自動更新程序之客戶端的示例代碼

    這篇文章主要為大家詳細介紹了利用C# WinForm實現(xiàn)自動更新程序之客戶端的實現(xiàn)方法,文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下
    2022-10-10
  • C#利用后綴表達式解析計算字符串公式

    C#利用后綴表達式解析計算字符串公式

    當我們拿到一個字符串比如:20+31*(100+1)的時候用口算就能算出結果為3151,因為這是中綴表達式對于人類的思維很簡單,但是對于計算機就比較復雜了。相對的后綴表達式適合計算機進行計算。本文就來用后綴表達式實現(xiàn)解析計算字符串公式,需要的可以參考一下
    2023-02-02
  • C#實現(xiàn)數(shù)據(jù)去重的方式總結

    C#實現(xiàn)數(shù)據(jù)去重的方式總結

    這篇文章主要來和大家一起來討論一下關于C#數(shù)據(jù)去重的常見的幾種方式,每種方法都有其特點和適用場景,感興趣的小伙伴可以了解一下
    2023-07-07

最新評論