多个StringBuilder.Append调用与单个.Append一起调用内部字符串concat

时间:2014-03-20 08:03:52

标签: .net string performance stringbuilder

在.NET中使用字符串构建器关于.Append方法的多次调用与连接其参数时对.Append的单次调用的最佳做法是什么?

sb.Append(name).Append("; ");

VS

sb.Append(name + "; ");

使用其中一个时是否有任何性能损失?在某些情况下,第二个变体可能更具可读性(写入时更短)。

使用短字符串进行这种简单的字符串连接会使使用字符串构建器的性能/内存增益无效吗?

2 个答案:

答案 0 :(得分:1)

所以我做了一个测试,在循环中使用三种方法追加文本100,000次。

(1)

    text += "Hello" + i.ToString();

(2)

    sb0.Append("Hello" + i.ToString());

(3)

    sb1.Append("Hello");
    sb1.Append(i.ToString());

结果为(1)花费108,332ms,(2)花费18ms,(3)花费19ms。

事实证明,简单连接比连续两次调用字符串生成器要快一些。我怀疑这与垃圾收集有关,而不是构建字符串的实际速度。

最重要的是,只要字符串相对较小,就可以毫无困难地使用字符串连接。

答案 1 :(得分:0)

第二种方法比第一种方法慢(虽然可以说不是很多,所以如果它有助于可读性,它不会受到伤害)。根据经验:如果合适,请使用string.Formatstring.Concat,只要您在循环中附加内容,就可以使用StringBuilder

我已经使用这种方法进行了一些性能测试:

var strings = Enumerable.Range(100000, 200000).Select(x => x.ToString()).ToArray();

var watch = new Stopwatch();
watch.Start();

for (var i = 0; i < 100000; ++i)
    // whatever method

var result = ...; // e.g. sb.ToString();
watch.Stop();

WriteResultToFile(result); // prevent optimizations
Console.WriteLine("Took: " + watch.ElapsedMilliseconds + "ms");

结果如下:

// Method 1: 39317ms
str += strings[i] + ", ";

// Method 2: 8ms
sb.Append(strings[i] + ", ");

// Method 3: 2ms
sb.Append(strings[i]);
sb.Append(", ");

// Method 4: 15ms
sb.Append(string.Format("{0}, ", strings[i]));

但是,如果您要连接固定数量的字符串,请使用string.Concat,因为它可以预先确定结果长度,因此非常高效。