自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C# 字符串拼接的幾種方式及其性能分析對(duì)比

開(kāi)發(fā)
不同的字符串拼接方式在性能和內(nèi)存使用上可能存在顯著差異。今天咱們一起來(lái)看看在C#中字符串拼接的常見(jiàn)6種方式及其使用BenchmarkDotNet進(jìn)行性能分析對(duì)比。

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

BenchmarkDotNet

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

    [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)對(duì)比測(cè)試分析報(bào)告

Method

Mean

Error

StdDev

Gen0

Gen1

Allocated

PlusOperator

2,066.28 us

35.761 us

63.566 us

5238.2813

789.0625

32283.12 KB

InterpolatedString

1,984.56 us

29.949 us

28.014 us

5238.2813

789.0625

32283.12 KB

StringFormat

2,112.02 us

25.020 us

23.404 us

5257.8125

777.3438

32369.06 KB

StringConcat

2,027.09 us

28.300 us

26.472 us

5257.8125

777.3438

32369.06 KB

StringJoin

2,017.36 us

27.111 us

22.639 us

5257.8125

777.3438

32369.06 KB

StringBuilder

13.63 us

0.065 us

0.058 us

23.2544

4.6387

143.96 KB

說(shuō)明:

  • Mean: 所有測(cè)量值的算術(shù)平均值。
  • Error: 99.9% 置信區(qū)間的一半。
  • StdDev: 所有測(cè)量值的標(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)對(duì)比測(cè)試結(jié)論

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

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

責(zé)任編輯:趙寧寧 來(lái)源: 追逐時(shí)光者
相關(guān)推薦

2025-02-13 08:13:29

C#字符串拼接

2024-12-20 12:10:19

2009-08-06 17:24:08

C#字符串

2009-09-02 16:21:20

C#字符串

2025-03-14 08:35:00

字符串C#字符串拼接

2009-08-21 15:06:09

C#連接字符串

2023-12-11 08:39:14

Go語(yǔ)言字符串拼

2013-06-24 15:16:29

Java字符串拼接

2024-11-29 07:32:38

2025-01-03 08:31:43

2025-03-27 03:20:00

C#開(kāi)發(fā)字符串

2023-10-31 18:57:02

Java字符串

2009-08-07 14:46:59

C#匹配字符串

2009-08-26 13:24:54

C#字符串

2009-08-24 17:06:37

C#字符串

2009-08-07 14:15:21

C#字符串分割

2009-08-07 14:22:56

C#字符串搜索

2009-08-07 14:34:33

C#模式字符串

2009-08-24 13:04:44

操作步驟C#字符串

2009-08-07 13:50:11

C#字符串
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)