C# 向StringBuilder添加多个字符串的方法中,哪种更快?
我有一个StringBuilder,我需要在其中添加许多短字符串。至少有两种方法。首先,分别添加每个字符串:C# 向StringBuilder添加多个字符串的方法中,哪种更快?,c#,.net,string,C#,.net,String,我有一个StringBuilder,我需要在其中添加许多短字符串。至少有两种方法。首先,分别添加每个字符串: StringBuilder sb = new StringBuilder (); sb.Append (str1); sb.Append (str2); ..... sb.Append (strN); 第二种方法是将所有字符串相加: sb.Append (string.Concat (str1, str2, ..., strN); 其中哪一种使用起来更快更可取? 注意:这个操作将在我
StringBuilder sb = new StringBuilder ();
sb.Append (str1);
sb.Append (str2);
.....
sb.Append (strN);
第二种方法是将所有字符串相加:
sb.Append (string.Concat (str1, str2, ..., strN);
其中哪一种使用起来更快更可取?
注意:这个操作将在我的程序中执行很多次(在循环中),我不知道,我是否应该通过string.Concat创建这么多字符串,这样它们就不会再被使用了。
我会说第一个,因为第二个是为
Concat
创建一个临时字符串
让我们看看更糟糕的情况:
x==sb.长度
y==总和(str 1-n长度)
sb有y-1字符的空间
在第一种情况下,您将复制以下内容:y-1
字符从字符串复制到sb,然后x+y-1
从旧sb缓冲区复制到新sb缓冲区,然后复制最后一个1
字符。所以x+2y-2+1
字符,所以x+2y-1
字符
在第二种情况下,Concat缓冲区的大小正确,因此可以将字符串中的y
字符复制到Concat缓冲区,再加上x
字符从旧的sb缓冲区复制到新的sb缓冲区(因为由于单次追加,sb知道在追加之前必须调整大小),从Concat缓冲区向新sb缓冲区添加y
。所以x+2y
。第一种方法应以1
字符获胜
但如果你真的需要加快速度:
int totalLength = str1.Length + str2.Length...
sb.EnsureCapacity(sb.Length + totalLength);
sb.Append(str1);
sb.Append(str2);
sb.Append(str3);
等等
这样,您可以复制大约x+y
个字符
首先确保sb
具有足够的容量,然后开始添加字符串
但我们所说的是过早优化,除非您的程序“千次”完成这项工作。性能不应基于猜测-您应该测试这些事情。特别是,它很可能受到以下因素的影响:
- 您正在使用的框架版本
- 字符串数(N)
- 字符串的大小
- 字符串的顺序(先是大字符串还是先是小字符串?)
- 可能还有很多我已经忘记的事情
如果您不需要StringBuilder
的话,我希望String.Concat在这里会更快,否则它可以计算出所需的确切缓冲区大小,分配一次,然后复制<代码>StringBuilder
可能需要多次重新分配。缺点是,如果N很大,它也会创建一个数组。编辑:我最初误读了这个问题,没有发现String.Concat的结果正在另一个Append
操作中使用。您能否在单个String.Concat
调用中编写整个操作,而不是将StringBuilder
和String.Concat
混合使用
但是是的,基本上你应该:
- 决定你实际需要的速度
- 编写可读性最高的代码
- 基准测试
- 仅当速度不够快时才更改为其他代码
您在这方面做过基准测试吗?您自己做基准测试怎么样?