字符串与StringBuilder

我明白两者的区别 String 而且 StringBuilder (StringBuilder 是可变的)但是两者之间的性能有很大的区别吗?

我正在工作的程序有很多case驱动的字符串追加(500+)。正在使用 StringBuilder 一个更好的选择吗?

请先 登录 后评论

10 个回答

DevelopingChris

从内存角度来看,StringBuilder的性能会更好。至于处理,执行时间上的差异可以忽略不计。

请先 登录 后评论
Gilligan

我相信StringBuilder更快,如果你有超过4个字符串,你需要附加在一起。另外,它还可以做一些很酷的事情,比如AppendLine。

请先 登录 后评论
Eric Z Beard

在。net中,StringBuilder仍然比追加字符串快。我很确定,在Java中,它们只是在附加字符串时在底层创建StringBuffer,所以没有什么区别。我不知道为什么他们还没有在。net中这样做。

请先 登录 后评论
Jay Bazuzi

是的,性能差异是显著的。参见KB文章“如何在Visual c#中提高字符串拼接性能”。

我总是尝试着先编写清楚的代码,然后再优化性能。这比反过来做要容易得多!然而,看到了两者在我的应用程序中的巨大性能差异后,我现在更仔细地考虑了一下这个问题。

幸运的是,在代码上运行性能分析以查看花费时间的地方,然后修改它以使用它是相对简单的 StringBuilder 在需要的地方。

请先 登录 后评论
deemer

StringBuilder可能更可取。原因是它分配了比当前需要更多的空间(您可以设置字符数),以便为将来的追加留出空间。然后,那些适合当前缓冲区的future追加不需要任何内存分配或垃圾回收,这可能是昂贵的。通常,我使用StringBuilder进行复杂的字符串拼接或多种格式化,然后在数据完成时转换为普通的string,并且我想再次获得一个不可变对象。

请先 登录 后评论
Alex Fort

如果要进行大量的字符串拼接,请使用StringBuilder。当您连接一个String时,每次都创建一个新的String,这会占用更多的内存。

亚历克斯

请先 登录 后评论
RichS

除了前面的答案之外,在考虑这类问题时,我总是做的第一件事是创建一个小型测试应用程序。在这个应用程序中,对这两种场景执行一些计时测试,看看哪种更快。

恕我直言,追加500个以上的字符串条目绝对应该使用StringBuilder。

请先 登录 后评论
Steve g

使用字符串进行连接可能导致运行时复杂性达到 O(n^2)

如果你使用 StringBuilder那么,需要复制的内存就会减少很多。与 3. 如果你能估计出期末考试的规模,你就能提高成绩 String 将会是。即使你不精确,你可能只需要增加容量 StringBuilder 做几次也能提高表现。

请先 登录 后评论
moswald

StringBuilder减少了分配和赋值的数量,代价是使用额外的内存。如果使用得当,它可以完全消除编译器一次又一次分配越来越大的字符串的需要,直到找到结果。

string result = "";
for(int i = 0; i != N; ++i)
{
   result = result + i.ToString();   // allocates a new string, then assigns it to result, which gets repeated N times
}

vs。

String result;
StringBuilder sb = new StringBuilder(10000);   // create a buffer of 10k
for(int i = 0; i != N; ++i)
{
   sb.Append(i.ToString());          // fill the buffer, resizing if it overflows the buffer
}

result = sb.ToString();   // assigns once
请先 登录 后评论
Community

我的方法一直是在连接4个或更多字符串或当我不知道如何连接发生时使用StringBuilder。

好性能的相关文章在这里

请先 登录 后评论
  • 20 关注
  • 0 收藏,250 浏览
  • Kuvo 提出于 2022-11-02 19:00