前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C#字符串拼接的6种方式及其性能分析对比

C#字符串拼接的6种方式及其性能分析对比

作者头像
郑子铭
发布于 2025-03-31 12:44:37
发布于 2025-03-31 12:44:37
5200
代码可运行
举报
运行总次数:0
代码可运行

前言

在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询、构建日志信息、格式化用户显示内容等。然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异。今天咱们一起来看看在C#中字符串拼接的常见6种方式及其使用BenchmarkDotNet进行性能分析对比。

BenchmarkDotNet

BenchmarkDotNet是一个基于.NET开源、功能全面、易于使用的性能基准测试框架,它为.NET开发者提供了强大的性能评估和优化能力。通过自动化测试、多平台支持、高级统计分析和自定义配置等特性,BenchmarkDotNet帮助开发者更好地理解和优化软件系统的性能表现。

拼接基础数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        private const int IterationCount = 1000;
        private const string StringPart1 = "追逐时光者";
        private const string StringPart2 = "DotNetGuide";
        private const string StringPart3 = "DotNetGuide技术社区";
        private readonly string[] _stringPartsArray = { "追逐时光者", "DotNetGuide", "DotNetGuide技术社区" };

+操作符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 使用 + 操作符拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string PlusOperator()
        {
            string result = StringPart1 + " " + StringPart2 + " " + StringPart3;
            return result;
        }

$内插字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 使用 $ 内插字符串拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string InterpolatedString()
        {
            string result = $"{StringPart1} {StringPart2} {StringPart3}";
            return result;
        }

String.Format

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 使用string.Format()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringFormat()
        {
            string result = string.Format("{0} {1} {2}", StringPart1, StringPart2, StringPart3);
            return result;
        }

String.Concat

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 使用string.Concat()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringConcat()
        {
            string result = string.Concat(StringPart1, " ", StringPart2, " ", StringPart3);
            return result;
        }

String.Join

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 使用string.Join()拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringJoin()
        {
            string result = string.Join(" ", _stringPartsArray);
            return result;
        }

StringBuilder

Append拼接字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 使用StringBuilder.Append拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringBuilderAppend()
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append(StringPart1);
            stringBuilder.Append(" ");
            stringBuilder.Append(StringPart2);
            stringBuilder.Append(" ");
            stringBuilder.Append(StringPart3);
            return stringBuilder.ToString();
        }

AppendFormat拼接字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        /// <summary>
        /// 使用StringBuilder.AppendFormat拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringBuilderAppendFormat()
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.AppendFormat("{0} {1} {2}", StringPart1, StringPart2, StringPart3);
            return stringBuilder.ToString();
        }

性能基准对比测试完整代码

咱们分别以少量字符串拼接和大量字符串拼接为例,进行性能基准对比测试:

说明:

  • Mean: 所有测量值的算术平均值。
  • Error: 99.9% 置信区间的一半。
  • StdDev: 所有测量值的标准差。
  • Gen0: 第 0 代 GC 每 1000 次操作收集一次。
  • Gen1: 第 1 代 GC 每 1000 次操作收集一次。
  • Gen2: 第 2 代 GC 每 1000 次操作收集一次。
  • Allocated: 每次操作分配的内存(仅托管内存,包含所有内容,1KB = 1024B)。
  • 1 ms: 1 毫秒(0.001 秒)。

少量字符串拼接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   using BenchmarkDotNet.Attributes;
using System.Text;

namespace BenchmarkDotNetExercise
{
    [MemoryDiagnoser]//记录内存分配情况
    public class StringConcatenationBenchmark
    {
        private const int IterationCount = 1000;
        private const string StringPart1 = "追逐时光者";
        private const string StringPart2 = "DotNetGuide";
        private const string StringPart3 = "DotNetGuide技术社区";
        private readonly string[] _stringPartsArray = { "追逐时光者", "DotNetGuide", "DotNetGuide技术社区" };

        #region 少量字符串拼接

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

        /// <summary>
        /// 使用 $ 内插字符串拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string InterpolatedString()
        {
            string result = $"{StringPart1} {StringPart2} {StringPart3}";
            return result;
        }

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

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

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

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

        /// <summary>
        /// 使用StringBuilder.AppendFormat拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string StringBuilderAppendFormat()
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.AppendFormat("{0} {1} {2}", StringPart1, StringPart2, StringPart3);
            return stringBuilder.ToString();
        }

        #endregion
    }
}

大量字符串拼接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   using BenchmarkDotNet.Attributes;
using System.Text;

namespace BenchmarkDotNetExercise
{
    [MemoryDiagnoser]//记录内存分配情况
    public class StringConcatenationBenchmark
    {
        private const int IterationCount = 1000;
        private const string StringPart1 = "追逐时光者";
        private const string StringPart2 = "DotNetGuide";
        private const string StringPart3 = "DotNetGuide技术社区";
        private readonly string[] _stringPartsArray = { "追逐时光者", "DotNetGuide", "DotNetGuide技术社区" };

        #region 大量字符串拼接

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

        /// <summary>
        /// 使用StringBuilder.Append拼接字符串
        /// </summary>
        /// <returns></returns>
        [Benchmark]
        public string BigDataStringBuilderAppend()
        {
            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();
        }

        #endregion
    }
}

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
为什么 IDEA 建议去掉 StringBuilder,而要使用 “+” 拼接字符串?
虽然有差异,但是差异极小,考虑到执行了100000次,每次耗时的差异就更小了,而且程序执行有各种因素影响执行效率,可以认为耗时差不多。也可以多次执行对比耗时差异,也可以发现基本一致。
Spark学习技巧
2024/03/27
1720
为什么 IDEA 建议去掉 StringBuilder,而要使用 “+” 拼接字符串?
.NET性能优化-复用StringBuilder
在之前的文章中,我们介绍了 dotnet 在字符串拼接时可以使用的一些性能优化技巧。比如:
InCerry
2022/11/14
3080
JVM-字符串底层实现原理
以上面两个文件我们可以看出,这种字符串的拼接在编译期间就已经优化了,直接就合并为一个字符串;并且这个字符串存放在字符串常量池
用户7353950
2022/05/11
2470
Java字符串String那些事
众所周知在java里面除了8种基本数据类型的话,还有一种特殊的类型String,这个类型是我们每天搬砖都基本上要使用它。
java金融
2020/12/14
4800
教妹学 Java 第 37 讲:字符串拼接
“哥,你让我看的《Java 开发手册》上有这么一段内容:循环体内,拼接字符串最好使用 StringBuilder 的 append() 方法,而不是 + 号操作符。这是为什么呀?”三妹疑惑地问。
沉默王二
2021/07/16
3170
聊聊字符串拼接的哪一些事儿
​ 字符串对我编程人员来说是字符串时每天见面的常客,你不认识不熟悉他都不得行,字符串的拼接更是家常便饭,那么在实际开发过程中实现字符串的拼接有哪一些方式呢?咱们一起来聊聊,来交流沟通,学习一波。也许你会说,那也太简单了嘛,谁不会啊,哈哈,使用起来确实简单,但是不一定我们都使用的方式还有优秀的方式吗?
小小许
2020/01/15
5680
聊聊字符串拼接的哪一些事儿
.NET性能优化-使用ValueStringBuilder拼接字符串
这一次要和大家分享的一个Tips是在字符串拼接场景使用的,我们经常会遇到有很多短小的字符串需要拼接的场景,在这种场景下及其的不推荐使用String.Concat也就是使用+=运算符。 目前来说官方最推荐的方案就是使用StringBuilder来构建这些字符串,那么有什么更快内存占用更低的方式吗?那就是今天要和大家介绍的ValueStringBuilder。
用户9127601
2022/06/09
5350
.NET性能优化-使用ValueStringBuilder拼接字符串
不能用 + 拼接字符串? 这次我要吊打面试官!
好久没维护《吊打面试官》系列了,今天再来一篇,这次真的要吊打了,哈哈!(看往期吊打系列请在后台回复:吊打,我会陆续更新……)
Java技术栈
2019/12/23
7020
不能用 + 拼接字符串? 这次我要吊打面试官!
高效拼接字符串,你会用 “+” 还是StringBuilder.append?
在《阿里java开发手册(泰山版)》(提取码:hb6i)中,对于Java字符串的拼接有一条规则如下:
陈哈哈
2020/07/03
4.8K0
Java 中拼接 String 的 N 种方式
Java 提供了拼接 String 字符串的多种方式,不过有时候如果我们不注意 null 字符串的话,可能会把 null 拼接到结果当中,很明显这不是我们想要的。
未读代码
2022/03/22
9850
Java 中拼接 String 的 N 种方式
Java 字符串拼接方法及使用场景
訾博ZiBo
2025/01/06
820
羞,Java 字符串拼接竟然有这么多姿势
我当时看到这条微信的第一感觉是:小菜你也太菜了吧,这都不知道为啥啊!我估计正在读这篇文章的你也会有同样的感觉。
沉默王二
2019/10/28
9020
关于Java里面的字符串拼接,你了解多少?
字符串拼接是我们日常开发中很常见的操作,虽然常见,但要是使用不当的的话,很有可能让你的程序处理效率降低一大半,所以我们有必要来重新了解一下Java里面的字符串操作。
我是攻城师
2018/07/23
5550
关于Java里面的字符串拼接,你了解多少?
Java字符串之性能优化
在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值。在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值转化成String(不然的话像System.out.println(1+’a')会输出98,而不是”1a”)。当然了,有一组String.valueOf方法可以完成这个(或者是基础类型对应的包装类的方法),不过如果有更好的方法能少敲点代码的话,谁还会愿意这么写呢?
哲洛不闹
2018/09/18
4360
没使用加号拼接字符串,面试官竟然问我为什么
小小白:主要是为了确保String对象中存储的值不会被改变,充分利用字符串常量池的优化策略,同时字符串对象的hashCode也不会被改变。如果String设计成可变的,那么自定义的类就可以通过集成String,重写其中的方法将其存储的值改变。如果String是可变的,将String类型变量作为参数传递的过程中,存储的将有可能会被改变,这样会导致安全隐患。
JavaQ
2020/03/31
1.1K0
Java细节:字符串的拼接
工作日忙于项目的逻辑实现,周六有点时间,从书柜里拿出厚厚的英文版Thinking In Java,读到了字符串对象的拼接。参考着这本书做个翻译,加上自己思考的东西,写上这篇文章记录一下。
技术小黑屋
2018/09/04
1.1K0
还在用StringBuilder进行字符串拼接?那你就OUT了
大部分人会这么做,但是我们发现里面有太重复的"," 和"+"了。感觉拼接不是很灵活。
Lvshen
2022/05/05
3450
还在用StringBuilder进行字符串拼接?那你就OUT了
019:使用String的conact()方法和“+”做字符串拼接有什么不同
可以通过查看字节码和JDK源码来比较二者的不同,将上面的代码使用javac StringContactExample2.java编译,然后使用javap -c StringContactExample2,可以看到对应的字节码内容。
阿杜
2019/03/15
2.1K0
019:使用String的conact()方法和“+”做字符串拼接有什么不同
Go语言如何高效的进行字符串拼接(6种方式进行对比分析)
string是一个8位字节的集合,通常但不一定代表UTF-8编码的文本。string可以为空,但是不能为nil。string的值是不能改变的。
Golang梦工厂
2022/07/11
7200
Go语言如何高效的进行字符串拼接(6种方式进行对比分析)
Java String + 拼接字符串原理
很明确,上述代码输出的结果是:"111111222222",但是它工作原理是怎样的呢?
用户7886150
2021/04/27
8750
推荐阅读
相关推荐
为什么 IDEA 建议去掉 StringBuilder,而要使用 “+” 拼接字符串?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档