编辑长字符串时String&StringBuilder?

时间:2014-09-11 07:16:23

标签: c# string performance stringbuilder

我有一个字符串,我必须编辑很多。长度未定义。 Replace(string, string)将是最常用的方法。

什么是更好string.Replace("", "")StringBuilder.Replace("", "")

public static string FormatMyString(string input)
{
    // ...
}

(代码示例简单而愚蠢。它们只是为了向您展示我正在做的事情。我总是得到问题:"您想做什么?&#34 ;)

3 个答案:

答案 0 :(得分:2)

  

什么是更好string.Replace("", "")StringBuilder.Replace("", "")

都不是。它们都没有用。在更一般的情况下:

  • 如果您正在进行一次替换,String.Replace的内部呼叫应该没问题
  • 如果您正在进行批次替换,考虑 StringBuilder以避免使用中间字符串

答案 1 :(得分:0)

IMHO String Builder是要走的路。

它具有创建成本,但由于更有效的字符串操作和连接,因此可以提供更好的性能。

正如我所说,这是一个成本所以你应该考虑做什么"编辑很多"意思。

很抱歉,我现在无法提供实际的基准测试结果,但我认为使用String Builder的门槛应该非常低......

希望这有帮助。

答案 2 :(得分:0)

你只是“询问”这些事情并没有得到任何好的价值。你需要基准测试。以此代码为例:

var sw = Stopwatch.StartNew();
var cc0 = GC.CollectionCount(0);
var s = (string)null;
for (var i = 0; i < 10000000; i++)
{
    s = "a";
    s += "b";
}
var cc1 = GC.CollectionCount(0);
sw.Stop();
Console.WriteLine(
    "collections == {0}, ms == {1}, string == \"{2}\"",
    cc1 - cc0,
    sw.ElapsedMilliseconds,
    s);

与此代码对比:

var sw = Stopwatch.StartNew();
var cc0 = GC.CollectionCount(0);
var sb = (StringBuilder)null;
for (var i = 0; i < 10000000; i++)
{
    sb = new StringBuilder();
    sb.Append("a");
    sb.Append("b");
}
var cc1 = GC.CollectionCount(0);
Console.WriteLine(
    "collections == {0}, ms == {1}, string == \"{2}\"",
    cc1 - cc0,
    sw.ElapsedMilliseconds,
    sb.ToString());

我得到的两个结果是:

collections == 63, ms == 336, string == "ab" // +=
collections == 228, ms == 692, string == "ab" // StringBuilder

StringBuilder占用的时间是原来的两倍,导致垃圾收集次数增加3.5倍以上。

当然,如果我要连接StringBuilder表现更好的非常长的字符串,但除非我测量它,否则我不会知道这一点。

在我们说出什么是最好的之前,您需要提供更详细的信息,说明您正在运行的代码以及“更好”(更快,更少内存,易于阅读的代码等)的含义。