【问题标题】:Performance StringBuilder Insert versus string Concat [duplicate]性能 StringBuilder 插入与字符串 Concat [重复]
【发布时间】:2015-12-23 03:04:48
【问题描述】:

将一个字符串附加到另一个字符串在性能上的效率更高?

使用StringBuilder.Insert 方法还是string.Concat 方法?

messageString.Insert(0, prependedString);

string.Concat(prependedString, messageString);

在我的情况下,消息字符串比较大,前置字符串很短。

【问题讨论】:

  • 如果您要连接两个以上的字符串,请使用StringBuilder
  • @M.kazemAkhgary 这不是真的。事实上,正是出于这个原因,首选 StringBuilder - 连接字符串会强制分配多个临时字符串,而 StringBuilder 仅操作单个缓冲区。这些临时字符串会一直保留到 GC 收集它们,这也会导致 CPU 浪费。随着时间的推移,这些分配可能会导致性能问题
  • @ChristophBrückmann 有很多关于此事的文章。连接两个字符串创建第三个。连接三个,创建第​​四个。它们中的每一个都需要分配一个缓冲区,该缓冲区会一直保留在内存中,直到垃圾收集器运行为止。事实上,太多的临时字符串会强制进行垃圾收集。这在桌面应用程序中很烦人,但在繁忙的服务器或 Web 应用程序中可能非常糟糕 - 僵尸的数量加起来,服务器必须停止处理并等待 GC 收集它们
  • @M.kazemAkhgary 为什么会有人继续在循环中实例化一个新的字符串生成器?
  • 即使启用了后台垃圾回收,CPU 时间也是 CPU 时间 - 即使它在另一个内核中运行,它仍然从处理中窃取周期。

标签: c# .net string stringbuilder


【解决方案1】:

这是How to use StringBuilder Wisely 的副本,简而言之,您可以在那里阅读我的完整答案:

Concat 函数比使用 StringBuilder 更快,因为输入函数的字符串数量是已知的。

【讨论】:

  • 感谢上帝,有人为此写了一个很好的答案。欢迎来到 Stack Overflow,顺便说一句!
  • 谢谢...我不是新人^^;
  • 但是您最近才开始回答大量问题。我注意到了。
  • 实际上,我正在寻找一个答案,该答案侧重于通过 StringBuilder 或字符串方法本身预先添加字符串。我正在通过 StringBuilder 创建 messageString,它实际上具有性能优势。这个 messageString 最终可能是空的或几十行长。如果 messageString 最终不为空,则应附加一个附加字符串。特别是我的假设是使用 StingBuilder 不会有效,因为构建器内的整个字符串需要进行某种移动。但我真的不知道它在内部是如何工作的。
  • StringBuilder 中的 string 不会移动,因为 StringBuilder 包含您的 strings 的 2 及其位置,直到您使用其 ToString 方法,这意味着预先添加你的 string 到列表的首位并等待。
【解决方案2】:

string.Concat 是在项目数固定的情况下最快的方法。这句话在所有情况下都成立。字符串有多长并不重要。

string.Concat 计算最终的字符串大小,然后将这些位复制到新分配的字符串中。不能再快了。

事实上,你应该写a + b而不是调用Concat(如果在特定情况下可能的话)。

对于大字符串使用字符串生成器

错误。为什么会这样?!

如果您要连接两个以上的字符串,请使用 StringBuilder

错误。如果数字是固定的,请使用 Concat。 StringBuilder 只会增加开销。

答案取决于你要连接多少个字符串,以及它们有多大

错误。我上面描述的算法总是最快的解决方案。

围绕 StringBuilder 的神话种类繁多。如果您了解这两个选项在内部是如何工作的,您可以自己回答所有这些问题。我没有研究和记住所有这些答案。我根据对内部的理解生成它们。

【讨论】:

  • 我同意你所说的一切,但为了避免任何误解,我们应该在频繁改变字符串时使用StringBuilder,对吗?出于记忆的原因,如果没有别的。
  • @Asad 你不能改变一个字符串,所以我假设你的意思是对临时字符串的动态操作数。那么,StringBuilder 通常是正确的选择。我发现这在实践中极为罕见。唯一经常这样做的情况是连接某种序列。我们有 string.Join 。
  • 您将(非常模糊的)问题限制在非常有限的情况下 - 不仅仅是固定字符串,而是在编译时知道数字。性能不仅与时钟时间或单个操作的执行速度有关。
  • “构建字符串”,如果您愿意的话。字符串,我的意思是一串字符,从概念上讲,与类型相反。就用例而言,从错误类型的字符串连接构建大型日志输出通常会导致瓶颈。
  • @PanagiotisKanavos 在 cmets 中澄清说他只想加入这两个字符串。让我们等待 OP 回应。
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 2015-04-29
  • 2013-04-13
  • 2012-01-22
  • 2011-12-01
  • 2011-12-10
  • 2010-09-09
相关资源
最近更新 更多