最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

在C#編程中字符串拼接是一種常見且基礎(chǔ)的操作,廣泛應(yīng)用于各種場景,如動(dò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)化能力。通過自動(dòng)化測試、多平臺支持、高級統(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)樗鼈儠?huì)導(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#?Winform消息通知系統(tǒng)托盤氣泡提示框ToolTip控件

    C#?Winform消息通知系統(tǒng)托盤氣泡提示框ToolTip控件

    這篇文章主要為大家介紹了C#或Winform中的消息通知之系統(tǒng)托盤的氣泡提示框窗口(系統(tǒng)toast通知)、ToolTip控件和ToolTipText屬性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 使用C#與SQL Server數(shù)據(jù)庫進(jìn)行交互的詳細(xì)流程

    使用C#與SQL Server數(shù)據(jù)庫進(jìn)行交互的詳細(xì)流程

    本文詳細(xì)介紹了如何使用Visual Studio創(chuàng)建Windows窗體應(yīng)用程序連接本地SQL Server數(shù)據(jù)庫,并實(shí)現(xiàn)數(shù)據(jù)插入、查詢和刪除等功能,通過步驟說明和代碼示例,展示了如何使用DataGridView控件和按鈕控件與數(shù)據(jù)庫進(jìn)行交互,文章還總結(jié)了易錯(cuò)點(diǎn),需要的朋友可以參考下
    2025-11-11
  • c# 如何實(shí)現(xiàn)不同進(jìn)程之間的通信

    c# 如何實(shí)現(xiàn)不同進(jìn)程之間的通信

    這篇文章主要介紹了c# 如何實(shí)現(xiàn)不同進(jìn)程之間的通信,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-11-11
  • WinForms中主要控件的詳細(xì)使用教程

    WinForms中主要控件的詳細(xì)使用教程

    WinForms (Windows Forms) 是 Microsoft 提供的用于構(gòu)建 Windows 桌面應(yīng)用程序的框架,它提供了豐富的控件集合,可以滿足各種 UI 設(shè)計(jì)需求,以下是 WinForms 中主要控件的詳細(xì)使用教程,,需要的朋友可以參考下
    2025-05-05
  • c#實(shí)現(xiàn)抓取高清美女妹紙圖片

    c#實(shí)現(xiàn)抓取高清美女妹紙圖片

    本文給大家分享的是一則使用c#實(shí)現(xiàn)抓取網(wǎng)絡(luò)高清美女妹紙圖片的代碼,這么好的東西,當(dāng)然不能獨(dú)享,推薦給小伙伴們。
    2015-03-03
  • C#中Region、Exclude的用法小結(jié)

    C#中Region、Exclude的用法小結(jié)

    本文主要介紹了C#中Region、Exclude的用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Unity實(shí)現(xiàn)大轉(zhuǎn)盤的簡單筆記

    Unity實(shí)現(xiàn)大轉(zhuǎn)盤的簡單筆記

    這篇文章主要為大家分享了Unity實(shí)現(xiàn)大轉(zhuǎn)盤的簡單筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 關(guān)于ASP網(wǎng)頁無法打開的解決方案

    關(guān)于ASP網(wǎng)頁無法打開的解決方案

    asp網(wǎng)頁實(shí)際上就是動(dòng)態(tài)網(wǎng)頁,是在服務(wù)端執(zhí)行和解析的。有時(shí)也很奇怪,經(jīng)常遇到asp網(wǎng)頁無法打開的情況,下面小編給大家整理些關(guān)于asp網(wǎng)頁無法打開的解決方案,需要的朋友可以參考下
    2015-08-08
  • 淺談c#開發(fā)者應(yīng)該了解的15個(gè)特性

    淺談c#開發(fā)者應(yīng)該了解的15個(gè)特性

    本文列舉了15個(gè)值得了解的C#特性,旨在讓.NET開發(fā)人員更好的使用C#語言進(jìn)行開發(fā)工作。
    2021-05-05
  • c#檢測端口是否被占用的簡單實(shí)例

    c#檢測端口是否被占用的簡單實(shí)例

    這篇文章主要介紹了c#檢測端口是否被占用的簡單實(shí)例,有需要的朋友可以參考一下
    2013-12-12

最新評論

靖边县| 普兰店市| 报价| 廊坊市| 阳山县| 大余县| 彩票| 遵化市| 西畴县| 清水县| 乌恰县| 祥云县| 屏山县| 彰武县| 锡林浩特市| 南阳市| 公主岭市| 汉川市| 镇远县| 嘉禾县| 景德镇市| 泸州市| 安丘市| 开远市| 瓦房店市| 中江县| 阿图什市| 江北区| 永丰县| 神农架林区| 泾川县| 西充县| 龙游县| 进贤县| 武平县| 抚宁县| 塘沽区| 东山县| 济南市| 绥滨县| 上高县|