为什么C#的String.Join在某个地方没有使用StringBuilder?

8

正如可以在这里看到的那样,String.Join的其中一种重载使用原始指针并使用称为UnSafeCharBuffer的东西。为什么会这样?这是一种性能优化吗?


9
是的,这是为了性能考虑。整个“string”非常经过优化。 - SLaks
3
使用StringBuilder最后仍需要复制到字符串中。直接写入返回字符串可以跳过这个开销。 - Ry-
此外,StringBuilder 有一个默认大小,可能并没有完全使用,并且每次超过该缓冲区时都会继续增加。因此,创建三到四个较小的字符串仍然要快得多。 - Greg
@Greg:三到四个较小的字符串?无论如何,您都可以创建一个具有精确初始(和最大)容量的 StringBuilder - Ry-
@Ry- 但是这仍然会被转换为“字符串”。因此,StringBuilder将消耗定义的一定比例的内存,只是在它变成一个“字符串”时会消耗更多的内存。归结为这个问题:http://www.yoda.arachsys.com/csharp/stringbuilder.html - Greg
显示剩余2条评论
1个回答

15

这是一种性能优化吗?

是的。

一般来说,不安全的代码通常用于低级别的非托管语言交互或者用于性能优化。在这种情况下,它是后者。

这就引出了一个问题:

为什么不对StringBuilder使用相同的技术呢?

不同的场景可以使用不同的优化技术;StringBuilders则专门针对其场景进行了优化。

这些场景在几个方面有所不同。Join 在预先知道将返回多少字节时进行调整,而 StringBuilder 不知道。 Join 知道生成的字符串将被生成一次,但是 StringBuilder 必须高效地支持创建、附加、ToString、附加、ToString等工作流程。等等。


但是String.Join还有其他三个重载/实现方式,实际上使用了StringBuilder...你只是在谈论其中一个。 - adjan
4
@Adrian: 我做出了合理的假设,认为原帖作者在谈论不使用字符串构建器的实现,因为问题是关于那种实现的,问题是“为什么C#的String.Join不使用StringBuilder?”鉴于这个问题,为什么会有人假设原帖作者在询问使用StringBuilder的实现呢? - Eric Lippert
2
我同意可以从问题中推断出这一点,尽管我会说它(特别是标题)听起来像只有这一个实现,没有其他的。 - adjan
@Adrian 我同意标题有点误导性。我会修改它。 - NetherGranite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接