通常我们使用“+”操作符来组合字符串,这样十分方便。但是这样并不是十分有效率,因为每次组合成的新字符串都需要重新开一片内存空间存储。
下面我们做一个简单的测试,将50000个整数组合成字符串:
string s1 = "";
for (int i = 0; i < 50000; i++)
s1 = s1 + i.ToString();
在测试环境张,这个循环花费了30430毫秒。
如果我们使用StringBuilder 类的Append 方法,就不必为每次组合成的字符串开辟新的内存空间:
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < 50000; i++)
sb.Append(i.ToString());
在同样的环境中测试,只花费了6毫秒。
StringBuilder 很明显的更加有效率,但是只是在进行大数据处理的时候有效。在只组合很少字符串的情况下,效率反而不如直接组合。具体原因可以查看这篇文章Concatenating Strings Efficiently.我总结它给出的原因为:
1. 在组合少量字符串的情况下使用StringBuilder 的代码阅读性差;
2. 也是主要原因,StringBuilder 虽然不会每次都为组合产生字符串开辟内存空间,但是它必须维护一个自己buffer,保存每次组合后的结果。但是StringBuilder 事先并不知道组合产生的中间字符串需要多大的buffer,因此理论上它要一个比产生字符串所需内存大buffer,如果不够则会自动增长。相比而言,在组合少量字符串的情况下,维护这个buffer的成本反而更高。