Ayende @ Rahien

Hi!
My name is Oren Eini
Founder of Hibernating Rhinos LTD and RavenDB.
You can reach me by phone or email:

ayende@ayende.com

+972 52-548-6969

, @ Q c

Posts: 5,971 | Comments: 44,508

filter by tags archive

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

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

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

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

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

Ken,

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

Bill Pierce

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

Ayende Rahien

Try it with date time, or your own class

Comment preview

Comments have been closed on this topic.

FUTURE POSTS

  1. Paying the rent online - one day from now

There are posts all the way to Aug 03, 2015

RECENT SERIES

  1. Production postmortem (5):
    29 Jul 2015 - The evil licensing code
  2. Career planning (6):
    24 Jul 2015 - The immortal choices aren't
  3. API Design (7):
    20 Jul 2015 - We’ll let the users sort it out
  4. What is new in RavenDB 3.5 (3):
    15 Jul 2015 - Exploring data in the dark
  5. The RavenDB Comic Strip (3):
    28 May 2015 - Part III – High availability & sleeping soundly
View all series

Syndication

Main feed Feed Stats
Comments feed   Comments Feed Stats