欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

BenchmarkDotNet

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

使用教程詳細(xì)介紹:使用BenchmarkDotNet對.NET代碼進(jìn)行性能基準(zhǔn)測試

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

private const int IterationCount = 1000;
private const string StringPart1 = "追逐時(shí)光者";
private const string StringPart2 = "DotNetGuide";
private const string StringPart3 = "DotNetGuide技術(shù)社區(qū)";
private readonly string[] _stringPartsArray = { "追逐時(shí)光者", "DotNetGuide", "DotNetGuide技術(shù)社區(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;
        }

$內(nèi)插字符串

        /// <summary>
        /// 使用 $ 內(nèi)插字符串拼接字符串
        /// </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();
        }

性能基準(zhǔn)對比測試完整代碼

    [MemoryDiagnoser]//記錄內(nèi)存分配情況
    public class StringConcatenationBenchmark
    {
        private const int IterationCount = 1000;
        private const string StringPart1 = "追逐時(shí)光者";
        private const string StringPart2 = "DotNetGuide";
        private const string StringPart3 = "DotNetGuide技術(shù)社區(qū)";
        private readonly string[] _stringPartsArray = { "追逐時(shí)光者", "DotNetGuide", "DotNetGuide技術(shù)社區(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>
        /// 使用 $ 內(nèi)插字符串拼接字符串
        /// </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();
        }
    }

性能基準(zhǔn)對比測試分析報(bào)告

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: 所有測量值的算術(shù)平均值。
  • Error: 99.9% 置信區(qū)間的一半。
  • StdDev: 所有測量值的標(biāo)準(zhǔn)差。
  • Gen0: 第 0 代 GC 每 1000 次操作收集一次。
  • Gen1: 第 1 代 GC 每 1000 次操作收集一次。
  • Gen2: 第 2 代 GC 每 1000 次操作收集一次。
  • Allocated: 每次操作分配的內(nèi)存(僅托管內(nèi)存,包含所有內(nèi)容,1KB = 1024B)。
  • 1 ms: 1 毫秒(0.001 秒)。

性能基準(zhǔn)對比測試結(jié)論

從上面的性能基準(zhǔn)對比測試分析報(bào)告來看StringBuilder是性能最好的字符串拼接方式,特別是在需要頻繁進(jìn)行拼接的場景中。其他方式(如+操作符、$內(nèi)插字符串、String.Format、String.ConcatString.Join)在性能上相對較差,因?yàn)樗鼈儠?dǎo)致多次內(nèi)存分配和復(fù)制。

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

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

相關(guān)文章

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

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

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

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

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

    C#如何消除驗(yàn)證碼圖片的鋸齒效果

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

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

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

    WinForm調(diào)用jar包的方法分析

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

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

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

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

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

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

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

    C#利用后綴表達(dá)式解析計(jì)算字符串公式

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

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

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

最新評論