Not all objects are created equals
I found something extremely surprising while profiling a project. Take a look at this piece of code:
Stopwatch stop = Stopwatch.StartNew(); for (int i = 0; i < 1000000; i++) { new WeakReference(null); } stop.Stop(); Console.WriteLine("WeakRef: " + stop.ElapsedMilliseconds); stop = Stopwatch.StartNew(); for (int i = 0; i < 1000000; i++) { new string('a', 5); } stop.Stop(); Console.WriteLine("'aaaaa': " + stop.ElapsedMilliseconds);
On my machine, this has the following output:
WeakRef: 980
'aaaaa': 35
Creating a WeakReference is much more costly than creating a normal object. Not surprising, when you think of it, WeakReference has deep ties to the CLR, but I couldn't really believe it when I saw it the first time.
Comments
Isn't the object created equally it just depends on the amount of work done in the Constructor (ctor)?
The constructor for WeakReference makes a call to GCHandle, which makes an extern call. The result of which is ~0.000850ms difference.
Why is it surprising? Do all your objects with constructors create in exactly the same amount of time?
[)amien
Run it in a profiler, you'll see where that cost is
not sure, but due to the immutability of string, it might've created a single 'aaaaa' object.
did you try to call i.ToString() instead? (would new a string so it's quite the same). or, new string('a', i) ?
Ken,
It doesn't matter what string you are using, or whatever you create another type
Are you sure that string interning doesn't have something to do with the performance of the string test?
Try it with date time, or your own class
Comment preview