This is my second article regarding performance. Most of the people use
string everywhere in their code. Actually when doing
string concatenation, do you know what exactly you are doing? It has a big drawback mainly in concatenation which can be overcome by
StringBuilder. It will give a vast improvement in performance when you use concatenation of
What is the Exact Difference?
First we will look at what happens when you concatenate two
strings. For a rough idea, think like this. In a loop, you are adding few numbers to get a
string to give all the numbers.
string returnNumber = "";
for(int i = 0; i<1000; i++)
returnNumber = returnNumber + i.ToString();
Here we are defining a
returnNumber and after that, in the loop we are concatenating the old one with the new to get a
string. Do you know when we do like that we are assigning it again and again? I mean it's really like assigning 999 new
Actually the concatenation will create a new
string returnNumber, with both old
i.ToString(). If we think roughly, how will the performance of the code be? Can you imagine it? No one thinks about this when coding.
If we can have something which is to be defined only once and add all the
strings into it, what can you say about the performance. That's what
StringBuilder returnNumber = new StringBuilder(10000);
for(int i = 0; i<1000; i++)
We are creating a
StringBuilder of length
10000 in memory where we can add all the
strings. This surely won't create a new
string each and every time. Actually we are creating a
StringBinder, and whenever something is added it will get copied into that memory area. At the end, we can get the
StringBuilder.ToString(). Here also, it won't create a new
string. It will return a
string instance that will point to the
string inside the
StringBuilder. See, how efficient this is?
To explain this in a practical manner, I'm not going to analyze IL code or Optimized JIT compiled code. You can see the differences by running the samples.
Why String? Can't Use StringBinder Everywhere?
No. You can't. When initializing a
StringBuilder, you are going down in performance. Also many actions that you do with
string can't be done with
StringBinder. Actually it is used mostly for situations as explained above. Last week, I showed a person who used
StringBuilder to just add two
strings together! It's really nonsense. We must really think about the overhead of initialization. In my personal experience, a
StringBuilder can be used where more than four or more
string concatenations take place. Also if you try to do some other manipulation (like removing a part from the
string, replacing a part in the
string, etc.), then it's better not to use
StringBuilder at those places. This is because we are anyway creating new
strings. Another important issue. We must be careful to guess the size of
StringBuilder. If the size which we are going to get is more than what is assigned, it must increase the size. This will reduce its performance.
- 19th April, 2004: Article submitted