I was wondering about StringBuilder and I\'ve got a question that I was hoping the community would be able to explain.
Let\'s just forget about code readability, which o
It's impossible to say, not knowing the size of string1
and string2
.
With the call to AppendFormat, it will preallocate the buffer just once given the length of the format string and the strings that will be inserted and then concatenate everything and insert it into the buffer. For very large strings, this will be advantageous over separate calls to Append which might cause the buffer to expand multiple times.
However, the three calls to Append
might or might not trigger growth of the buffer and that check is performed each call. If the strings are small enough and no buffer expansion is triggered, then it will be faster than the call to AppendFormat
because it won't have to parse the format string to figure out where to do the replacements.
More data is needed for a definitive answer
It should be noted that there is little discussion of using the static Concat method on the String class (Jon's answer using AppendWithCapacity
reminded me of this). His test results show that to be the best case (assuming you don't have to take advantage of specific format specifier). String.Concat
does the same thing in that it will predetermine the length of the strings to concatenate and preallocate the buffer (with slightly more overhead due to looping constructs through the parameters). It's performance is going to be comparable to Jon's AppendWithCapacity
method.
Or, just the plain addition operator, since it compiles to a call to String.Concat
anyways, with the caveat that all of the additions are in the same expression:
// One call to String.Concat.
string result = a + b + c;
NOT
// Two calls to String.Concat.
string result = a + b;
result = result + c;
For all those putting up test code
You need to run your test cases in separate runs (or at the least, perform a GC between the measuring of separate test runs). The reason for this is that if you do say, 1,000,000 runs, creating a new StringBuilder in each iteration of the loop for one test, and then you run the next test that loops the same number of times, creating an additional 1,000,000 StringBuilder
instances, the GC will more than likely step in during the second test and hinder its timing.
Append will be faster in most cases because there are many overloads to that method that allow the compiler to call the correct method. Since you are using Strings
the StringBuilder
can use the String
overload for Append
.
AppendFormat takes a String
and then an Object[]
which means that the format will have to be parsed and each Object
in the array will have to be ToString'd
before it can be added to the StringBuilder's
internal array.
Note: To casperOne's point - it is difficult to give an exact answer without more data.
Faster is 1 in your case however it isn't a fair comparison. You should ask StringBuilder.AppendFormat()
vs StringBuilder.Append(string.Format())
- where the first one is faster due to internal working with char array.
Your second option is more readable though.