Ayende @ Rahien

Refunds available at head office

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

Yitzchok
07/28/2008 11:32 PM by
Yitzchok

Isn't the object created equally it just depends on the amount of work done in the Constructor (ctor)?

Damien Guard
07/29/2008 01:07 AM by
Damien Guard

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

Ayende Rahien
07/29/2008 05:30 AM by
Ayende Rahien

Run it in a profiler, you'll see where that cost is

Ken Egozi
07/29/2008 07:30 AM by
Ken Egozi

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) ?

Ayende Rahien
07/29/2008 07:31 AM by
Ayende Rahien

Ken,

It doesn't matter what string you are using, or whatever you create another type

Bill Pierce
07/29/2008 01:53 PM by
Bill Pierce

Are you sure that string interning doesn't have something to do with the performance of the string test?

Ayende Rahien
07/29/2008 01:55 PM by
Ayende Rahien

Try it with date time, or your own class

Comments have been closed on this topic.