lucisferre

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult. —Sir Charles Antony Richard Hoare”

Strings Are Immutable Stupid!

Last night, I was reading through the MCTS cram guide for Application Developer (and drinking beers) and enjoying a bit of a laugh as I learned ground breaking concepts like “value types” and “creating class” (it’s not all that bad) when I came across this “Strings are immutable in the .NET Framework”.

I’m sure most people reading this (which, of course, assumes anyone is reading this) are either saying, “who cares, even in java strings are immutable, everyone knows this you idiot”, or alternatively asking “what’s an immutable?”. To the first of you I say “fuck off, I skipped most of my compsci classes”, to the rest of you I say ”let me Google that for you…”.

After reading that strings are immutable, I immediately thought of some code I am working on that reads a giant ASCII CSV file about 700k lines long. As part of the process it reads and re-builds a CSV line character by character using nothing but “+=” assignments. I was horrified, as I realized that I was literally creating and assigning millions of string objects unecessarily.

I had done a horrible thing, but I knew how to fix it, use a StringBuilder class instead. Now, my morbid curiosity drove me to fire up my code in dotTrace just to see how horrible. Here are the results for the original method:

1
2
3
4
18.99 % FixCSVStringQuotes - 142869 ms - 757810 calls - ISMDataAdapter.Data.ISMDataReader<T>.FixCSVStringQuotes(String)   
17.58 % Concat - 132204 ms - 152390966 calls - System.String.Concat(Object, Object)   
0.01 % ToString - 109 ms - 757810 calls - System.Char.ToString()   
0.00 % Concat - 0 ms - 64 calls - System.String.Concat(String, String)

Results for StringBuilder version:

1
2
3
4
5
10.00 % FixCSVStringQuotes2 - 29408 ms - 757810 calls - ISMDataAdapter.Data.ISMDataReader<T>.FixCSVStringQuotes2(String)   
7.00 % Append - 20574 ms - 153148776 calls - System.Text.StringBuilder.Append(Char)   
0.07 % StringBuilder..ctor - 194 ms - 757810 calls - System.Text.StringBuilder..ctor()   
0.03 % ToString - 101 ms - 757810 calls - System.Text.StringBuilder.ToString()   
0.00 % Append - 0 ms - 64 calls - System.Text.StringBuilder.Append(String)

Total time went from 143 seconds to 29 seconds. Pretty significant really. So now I know, “strings are immutable stupid!” Thanks MCTS!

Comments