字符串拼接的效率问题

1.string.join
当字符串个数较少(少于1000个),或者从固定字符串数组中取字符串拼接时,string.join的效率最高
2.string.Concat
当分割符是string.empty时,string.join等同于string.Concat,同时,string.Concat等同于使用+,c#编译器会将+编译成和Concat一样的代码;
当字符串小于等于四个时,用一个语句拼接效率最高,如使用:

string.Concat("A","B","C","D");

当拼接的字符串多于5个时,string.Concat会接收一个数组作为参数,这反而会降低字符串拼接效率
所以当字符串超过五个时,每四个拼接一次效率最高:
如:

var result = string.Concat("A","B","C","D");
result.Concat("E");

这等价于使用:

string result  = "A"+"B"+"C"+"D";
result += "D";

3.StringBuilder
由于StringBuilder启动消耗很大,当字符串较少时(少于1000个时),使用StringBuilder效率反而不高
4.String.Format
一般用于较小数量的字符串拼接,效率略地于stringbuilder,但是可读性更好。

总结:少量字符串时,string.Concat()效率最高,但是string.Format()可读性更好,处理大量非数组中的字符串时,使用stringbuilder。

我觉得,提升处理字符串的效率的关键在于减少字符串数进而降低GC对性能的影响。由于字符串是不可变的,因而要降低字符串的拷贝。

同时,除非真的在字符串处理中遇到了性能瓶颈,否则在乎这点效率问题真的没必要。
记住:不要过度优化。

感兴趣的可以验证下上面的结果。附上一张图供大家理解字符串的不可变性。

string s1 = "Hello"
string s2 = s1;
s2 +="User";

在这里插入图片描述
引用本质上是保存一个变量的地址,当声明一个变量s1时,其指向内存中的"Hello"这个数据块。而string s2 = s1只是引用对等,此时s2和s1同时指向内存中的“Hello”数据块。但是,当s2+=“User”时,因为字符串的不可变性,不会更改“Hello”这个数据块,而是单独分配一个内存块,并拷贝“Hello”这个数据块,再在其基础上进行更改。

猜你喜欢

转载自blog.csdn.net/u010178308/article/details/85917828