使用StringBuilder类的Append方法和使用“+”运算符进行连接有什么区别?
在什么情况下,使用Append方法比“+”操作符在连接两个字符串时更加高效或更快?
使用StringBuilder类的Append方法和使用“+”运算符进行连接有什么区别?
在什么情况下,使用Append方法比“+”操作符在连接两个字符串时更加高效或更快?
String
和StringBuilder
是不同的类。
String
类表示不可变类型,而StringBuilder
类表示可变类型。+
连接字符串时,它使用String.Concat
方法。每次都会返回一个新的字符串对象。
StringBuilder.Append
方法会追加指定字符串的副本。它不会返回新字符串,而是改变原有字符串。
为了达到高效的目的,建议阅读Jeff的文章The Sad Tragedy of Micro-Optimization Theater
。
这没什么关系!
我们已经知道这些操作都不会在循环中执行,因此我们可以排除原始字符串拼接的性能差的问题。剩下的只是微观优化,一旦你开始担心微小的优化,你就已经走上了错误的道路。
哦,你不相信我?可悲的是,我自己也不相信,这就是为什么我首先被卷入其中的原因。以下是我的结果——对于双核3.5 GHz Core 2 Duo进行了100,000次迭代。
1: Simple Concatenation 606 ms
2: String.Format 665 ms
3: string.Concat 587 ms
4: String.Replace 979 ms
5: StringBuilder 588 ms
字符串是不可变的,所以当你添加时,实际上在后台创建了一个新对象。
当你使用 StringBuilder
时,它提供了一种高效的方法来连接字符串。
说实话,如果你只使用一两次,你不会真正注意到有很大的改进。但是当你在循环中使用 StringBuilder
时,效率就会提高。
string s = "a" + "b";
最好的情况是性能没有差别,但很可能比使用StringBuilder更快,而且更容易阅读。
StringBuilder更适用于连接编译时不知道数量的任意字符串的情况。