对一个字符串使用多个字符串构建器

时间:2011-07-29 02:10:30

标签: c# java string stringbuilder

所以我主要是C#和Java开发人员,但我想这个问题可能适用于任何使用StringBuilder或其衍生物的编程语言。

好的,或许不太常见的知识,连接即使少量的字符串也可能成为主要的性能杀手(尽管这是有争议的)。我的问题是,是否有人知道在字符串生成器中使用字符串生成器的性能影响。为了澄清我的意思,让我加入一些虚拟代码来帮助说明我的观点。

此外,我意识到通过调用StringBuilder的多个实例自然会有性能损失但我不相信我会调用它足以导致任何真正的性能问题。 (这种假设也可能是错误的,任何关于此的意见都会有所帮助)

public string StringToGet()
{
     StringBuilder sb = new StringBuilder("Some Text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append(MethodThatCreatesAnotherString());
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append(MethodThatCreatesAnotherString());
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append(MethodThatCreatesAnotherString());
     //etc   

     return sb.toString();

}

private string MethodThatCreatesAnotherString()
{
     StringBuilder sb = new StringBuilder("Other text");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");

     return sb.ToString();
}

逻辑告诉我这不应该是一个问题,但是对于这种方法来说似乎并不恰到好处。任何人都可以对以下问题有所了解

  1. 这是否比仅使用其他方法并使用单个StringBuilder创建显着更大的性能影响
  2. 这是一种合理可接受的做法。
  3. 任何现场对此都将非常感激。

3 个答案:

答案 0 :(得分:9)

通常,如果直接字符串连接的数量大于5,则最好使用StringBuilder。如果您可以控制反过来构建字符串的方法,为什么不考虑将StringBuilder传递给方法?

public void MethodThatCreatesAnotherString(StringBuilder sb)
{
   // code that appends to StringBuilder
}

因此,当调用该函数时,您传入当前的StringBuilder,并且不会失去性能损失,但这是以潜在的混淆为代价的。

那就是说,除非你进入数百或数千个这样的操作,否则我不担心这里的过早优化。你的主要性能是必须两次(即在方法中附加字符串,然后附加完整的字符串),但你仍然不会在性能上达到使用的程度+串联。

编辑:如何使用它的澄清示例:

string SomeMethodCreatingAString()
{
   StringBuilder sb = new StringBuilder();
   sb.append("more text to add");
   sb.append("more text to add");
   sb.append("more text to add");
   sb.append("more text to add");
   sb.append("more text to add");
   MethodThatCreatesAnotherString(sb);
   // more text
   return sb.ToString();
}

因此,您不会在第二种方法中追加该字符串,只需在该方法中使用相同的StringBuilder即可。希望这是有道理的。

答案 1 :(得分:4)

我不确定性能影响,但更改MethodThatCreatesAnotherString方法的签名以接受StringBuilder将无需多个StringBuilder实例。

答案 2 :(得分:4)

由于http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html显示连接字符串的不同方式之间的差异非常小,直到你得到大量的连接。

因此,除非您已经知道此代码存在性能问题,否则我认为没问题。在您的示例中,您实际上只获得了3个额外的字符串构建器和3个额外的字符串分配。

从长远来看,你应该尝试做最简单的事情,只要担心复杂的微优化,如果你确定你需要它们并进行测试就可以了。