Why doesn't C#'s String.Join use StringBuilder at one point? [duplicate]
Asked Answered
F

1

8

As can be seen here, one of String.Join's overloads works with raw pointers and uses something called UnSafeCharBuffer. Why is this? Is it a performance optimization?

Fallible answered 17/1, 2019 at 21:33 Comment(7)
Yes; that's for performance. All of string is very heavily optimized.Customary
StringBuilder still has to copy to a string as the final step. Writing directly to the return string skips that overhead.Corpulent
Also StringBuilder has a default size that may not be entirely consumed, and continues to increase by that buffer every time you exceed. So three or four smaller strings being created is still a lot faster.Spencerspencerian
@Greg: Three or four smaller strings? Anyway, you can create a StringBuilder with an exact initial (and maximum) capacity.Corpulent
@Corpulent But that still is converted into a string. So StringBuilder will consume a percentage of memory defined, just to consume more memory when it becomes a string. Boils down to this yoda.arachsys.com/csharp/stringbuilder.htmlSpencerspencerian
@Greg: Correct. What do you mean by “three or four smaller strings” though?Corpulent
That smaller immutable strings consume less memory than the overhead generated by StringBuilder often.Spencerspencerian
R
15

Is a performance optimization?

Yes.

In general you should expect that unsafe code is either for low-level unmanaged language interop or for performance optimization. In this case it is the latter.

This then suggests the question:

Why not use the same techniques for StringBuilder?

Different scenarios can be tuned using different optimization techniques; StringBuilders are optimized for their scenarios.

The scenarios are different in several ways. Join knows ahead of time exactly how many bytes will be returned; StringBuilder does not. Join knows that the resulting string will be generated exactly once, but a StringBuilder has to support the create, append, ToString, append, ToString, ... workflow efficiently. And so on.

Ralaigh answered 17/1, 2019 at 22:0 Comment(4)
but there are three other overloads/implementations of String.Join that actually use StringBuilder... You're only talking about a specific one.Exclusive
@Adrian: I made the reasonable assumption that the original poster was talking about the implementation that does not use a stringbuilder, because the question was about that implementation, and the question was "Why doesn't C#'s String.Join use StringBuilder?" Why would anyone assume that the OP was asking about an implementation that does use StringBuilder, given that question?Ralaigh
I agree one can infer this from the question, although i would say that it (especially the title) sounds like there was only this one implementation, and no otherExclusive
@Adrian I agree that the title is a little misleading. I'll revise it.Fallible

© 2022 - 2024 — McMap. All rights reserved.