我有一个StringBuilder,我需要添加许多短字符串。至少有两种方式。首先是分别添加每个字符串:
StringBuilder sb = new StringBuilder ();
sb.Append (str1);
sb.Append (str2);
.....
sb.Append (strN);
第二个是将所有字符串添加到一起:
sb.Append (string.Concat (str1, str2, ..., strN);
哪一种更快,更适合使用? P.S。:该操作将在我的程序中执行多次(在循环中)并且我不知道,我是否应该通过string.Concat创建这么多字符串,以便它们不再被使用。
答案 0 :(得分:2)
我会说第一个,因为第二个是为string
创建一个临时Concat
。
让我们看看更糟糕的情况:
x == sb.Length;
y ==总和(str 1-n长度)sb有y - 1个字符的空间。
在第一种情况下,您将从字符串中复制:
y - 1
个字符到sb,然后从旧的sb缓冲区复制到新的sb缓冲区x + y - 1
,然后复制1
个字符。所以x + 2y - 2 + 1
个字符,所以x + 2y - 1
个字符。在第二种情况下,Concat缓冲区的大小正确,因此您将字符串中的
y
个字符复制到Concat缓冲区加上x
从旧的缓冲区到新的sb缓冲区(因为谢谢单个附加,sb知道他必须在附加之前调整大小),加上来自Concat缓冲区的y
到新的sb缓冲区。所以x + 2y
。第一种方法应该以{{1}}字符获胜。
但如果你真的需要加快速度:
1
等等。
通过这种方式,您可以复制int totalLength = str1.Length + str2.Length...
sb.EnsureCapacity(sb.Length + totalLength);
sb.Append(str1);
sb.Append(str2);
sb.Append(str3);
个字符。
首先确保x + y
有足够的容量,然后开始添加字符串。
但我们说的是过早优化,除非你的程序“千分之一”做这件事。
答案 1 :(得分:1)
与往常一样,性能不应该基于猜测 - 你应该测试这些东西。特别是,它可能会受到以下因素的影响:
如果您不需要String.Concat
,我希望 StringBuilder
更快,因为它可以解决确切的缓冲区大小,分配一次,然后复制。 StringBuilder
可能需要多次重新分配。缺点是如果N很大,它也会创建一个数组。编辑:我最初误解了这个问题,没有发现String.Concat
的结果正在另一个Append
操作中使用。您能否在一次String.Concat
来电中编写整个操作,而不是混合StringBuilder
和String.Concat
。
但是,基本上你应该: