Click here to Skip to main content
Click here to Skip to main content

Strings are from earth and StringBuilder from mars.

By , 1 May 2012
 

Introduction

I was happily married to string for a long time until I came to know the reality that “Strings are immutable” and not suitable for all scenarios. Recently I was working on a heavy HTML parser application and the program used to go out of memory frequently. The completely HTML parsing logic was using string variables.

After reading around I came to know the main reason was the immutable behavior of string. Immutable means once the data is assigned cannot be changed.

For instance if you are looping using a string variable like the code given below. Every assignment to the string creates new copies of variables and the previous copy is sent for garbage collection. So the below for loop generates different memory copies of data and the recently created is the current value.

   

Now you must be wondering why this absurd behavior. Any lame person (like me?) can conclude this is not efficient and neither looks logical.

The sacrifice for thread safety

Before I start with the solution I wanted to understand why Microsoft team thought about this weird behavior. Thanks to http://stackoverflow.com/questions/2365272/why-net-string-is-immutable things started looking logical.

If you are using string variables in multithreaded scenarios every thread modification will create new copy of memory ensuring that you do not land in to multi-threaded issues. In other words thread safety is built-in by itself when new copies of data are created.

Not all work on ships

The next thing which started itching me is what if my application is not multi-threaded. What if my main motive is to save memory resources and ensure that I do not go out of memory issues?. Here’s comes the hero from mars “StringBuilder”.

“Stringbuilder” are not immutable, in other words if you change the variable data the same memory location is modified. VOW, that looks lot of memory saving during heavy concatenation operation as compared to string.

   

I wanted to see for myself that earth is flat

As a curios developer it was difficult for me to digest that internally string creates different copies of data. Out of curiosity I downloaded the CLR Profiler and ran two test of code as shown below.

One for string as the below.

string x ="";

for (inti = 0; i< 10000; i++)
{
x = "Shiv"+ x;

}

One for string builder.

StringBuilder x = newStringBuilder();

for (inti = 0; i< 10000; i++)
{
x.Append("Shiv");

}

Watch the allocated bytes, 400235631 bytes is way greaterthan 136597bytes.

Watch the video below for the real demo

If you do not believe what I have written see the actual video demo as follows

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Shivprasad koirala
Architect http://www.questpond.com
India India
Member

I am a Microsoft MVP for ASP/ASP.NET and currently a CEO of a small
E-learning company in India. We are very much active in making training videos ,
writing books and corporate trainings. Do visit my site for 
.NET, C# , design pattern , WCF , Silverlight
, LINQ , ASP.NET , ADO.NET , Sharepoint , UML , SQL Server  training 
and Interview questions and answers


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5memberRahul Rajat Singh28 Jun '12 - 1:12 
GeneralMy vote of 5memberFarhan Ghumra17 Jun '12 - 19:23 
GeneralMy vote of 5memberPerić_Željko7 Jun '12 - 10:29 
QuestionNicememberCIDev7 Jun '12 - 6:30 
GeneralMy vote of 4memberChamila Ranasinghe5 May '12 - 18:30 
QuestionDon't forget about...memberGamersWanted4 May '12 - 4:10 
SuggestionRe: Don't forget about...memberRichard Deeming10 May '12 - 9:01 
AnswerRe: Don't forget about...memberDrWheetos7 Jun '12 - 11:12 
GeneralMy vote of 5mvpthatraja2 May '12 - 17:56 
GeneralRe: My vote of 5memberShivprasad koirala2 May '12 - 18:09 
QuestionStringBuilder does allocate and discard *some* memorymembersupercat92 May '12 - 9:56 
AnswerRe: StringBuilder does allocate and discard *some* memorymemberRichard Deeming10 May '12 - 9:09 
GeneralMy vote of 5memberNicolas Gordillo2 May '12 - 8:43 
GeneralMy vote of 5mentorBrij2 May '12 - 3:49 
GeneralMy vote of 5memberBRShroyer2 May '12 - 2:06 
GeneralMy vote of 5memberJαved2 May '12 - 1:26 
GeneralMy vote of 5mvp_ Kunal Chowdhury _2 May '12 - 0:48 
GeneralRe: My vote of 5memberBRShroyer2 May '12 - 2:01 
GeneralRe: My vote of 5mvp_ Kunal Chowdhury _2 May '12 - 2:46 
GeneralRe: My vote of 5memberShivprasad koirala2 May '12 - 4:06 
GeneralRe: My vote of 5mvp_ Kunal Chowdhury _2 May '12 - 4:10 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 2 May 2012
Article Copyright 2012 by Shivprasad koirala
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid