正如可以在这里看到的那样,String.Join
的其中一种重载使用原始指针并使用称为UnSafeCharBuffer
的东西。为什么会这样?这是一种性能优化吗?
这是一种性能优化吗?
是的。
一般来说,不安全的代码通常用于低级别的非托管语言交互或者用于性能优化。在这种情况下,它是后者。
这就引出了一个问题:
为什么不对StringBuilder使用相同的技术呢?
不同的场景可以使用不同的优化技术;StringBuilders则专门针对其场景进行了优化。
这些场景在几个方面有所不同。Join
在预先知道将返回多少字节时进行调整,而 StringBuilder
不知道。 Join
知道生成的字符串将被生成一次,但是 StringBuilder
必须高效地支持创建、附加、ToString
、附加、ToString
等工作流程。等等。
String.Join
还有其他三个重载/实现方式,实际上使用了StringBuilder
...你只是在谈论其中一个。 - adjan
StringBuilder
最后仍需要复制到字符串中。直接写入返回字符串可以跳过这个开销。 - Ry-StringBuilder
有一个默认大小,可能并没有完全使用,并且每次超过该缓冲区时都会继续增加。因此,创建三到四个较小的字符串仍然要快得多。 - GregStringBuilder
。 - Ry-StringBuilder
将消耗定义的一定比例的内存,只是在它变成一个“字符串”时会消耗更多的内存。归结为这个问题:http://www.yoda.arachsys.com/csharp/stringbuilder.html - Greg