StringBuilder vs &ers等于concatentation

时间:2015-12-17 21:00:51

标签: asp.net vb.net string

我被教导要提高VB.NET的性能,我们可以使用StringBuilder来连接字符串。

StringBuilder1.Append(string1)
StringBuilder1.Append(string2)

相反:

string1 = string1 & string2

同样,StringBuilder的性能增益是否超过&=级联?

StringBuilder1.Append(string1)
StringBuilder1.Append(string2)

相反:

string1 &= string2

我团队中一位资深的开发人员反对使用StringBuilder。有没有办法对这些差异进行基准测试?或者除了在大容量环境中,差异是微不足道的?我知道StringBuilder有很多答案,而不是网络上的连接和SO,但我找不到与&=串联有关的任何答案。

2 个答案:

答案 0 :(得分:1)

a &= b只是a = a & b的快捷方式。因此他们的速度相等。

StringBuilder连接2个字符串的速度并不快,但是如果要重复追加字符串,它可以更有效地工作,因为它使用了一个聪明的算法来减少内存分配和字符串复制操作。

另一方面,字符串连接总是创建一个新字符串,因此每次都会分配新的内存,并且每次都会复制连续增长的字符串。

a = "hello"
a &= b
a &= c
a &= d
...

每次为新字符串创建和分配内存。

根据Eric Lippert“在新实现中,字符串构建器维护一个相对较小的数组的链接列表,并在旧的数组满了时将新数组附加到列表的末尾。”

最后一个字符串只被分配一次(因为现在它的最终长度是已知的)并且所有字符串片段都被复制到它。

内存分配很快。当垃圾收集器想要收集未使用的内存时,真正的问题就来了。必须对收集进行评估的内存块越多,花费的时间就越多,而且这个过程比内存分配更耗时。

答案 1 :(得分:0)

字符串是不可变的。这意味着对于每个字符串操作,都会发生新的内存分配。这在性能和资源方面并不好。 StringBuilder与那些 BUT 的工作效果稍好,它带来了StringBuilder实例化的成本。

我使用字符串的方式。

因此,如果我必须连接3-4个字符串,我会使用标准方式。 在循环中(特别是当我期望大量操作时)我总是使用StringBuilder。