Hmm, my code:

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Xml;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.IO;
using System.Collections;
using System.Configuration;
using System.Data.SqlTypes;

using TestLib;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Threading;

namespace CS20Tests
{
        public class Program
        {
                public static void Main(string[] args)
                {
                        Runner r = new Runner();
                        Stopwatch sw = new Stopwatch();
                        sw.Start();
                        r.Run1();
                        sw.Stop();
                        Console.WriteLine("First run took: {0}", 
sw.ElapsedMilliseconds);

                        sw.Reset();
                        sw.Start();
                        r.Run2();
                        sw.Stop();
                        Console.WriteLine("Second run took: {0}", 
sw.ElapsedMilliseconds);
                }
        }


        public class Runner
        {
                private const int AMOUNT = 1000000;

                public void Run1()
                {
                        for(int i = 0; i < AMOUNT; i++)
                        {
                                MyClass s = Activator.CreateInstance<MyClass>();
                        }
                }

                public void Run2()
                {
                        for(int i = 0; i < AMOUNT; i++)
                        {
                                MyClass r = 
(MyClass)Activator.CreateInstance(typeof(MyClass));
                        }
                }
        }

        public class MyClass
        {
                private int _foo, _bar;

                public void Bla()
                {
                }

                /// <summary>
                /// Gets / sets foo
                /// </summary>
                public int Foo
                {
                        get
                        {
                                return _foo;
                        }
                        set
                        {
                                _foo = value;
                        }
                }


                /// <summary>
                /// Gets / sets bar
                /// </summary>
                public int Bar
                {
                        get
                        {
                                return _bar;
                        }
                        set
                        {
                                _bar = value;
                        }
                }
        }
}

output:
First run took: 2657
Second run took: 345
Press any key to continue . . .

                FB

 
> Funny, I get exactly the inverse behavior both in debug and release ... ?!
> 
> using System;
> using System.Collections.Generic;
> using System.Text;
> 
> namespace ConsoleApplication1
> {
>   class Program
>   {
>     static void Main(string[] args)
>     {
>       const int Count = 1000000;
> 
>       DateTime now = DateTime.Now;
>       for (int i = 0; i < Count; i++)
>       {
>         MyReferenceType t = Activator.CreateInstance<MyReferenceType>();
>       }
>       Console.WriteLine("typed ref:\t {0}", DateTime.Now.Ticks - now.Ticks);
> 
>       now = DateTime.Now;
>       for (int i = 0; i < Count; i++)
>       {
>         MyReferenceType t = (MyReferenceType)
> Activator.CreateInstance(typeof(MyReferenceType));
>       }
>       Console.WriteLine("untyped ref:\t {0}", DateTime.Now.Ticks - now.Ticks);
> 
>       now = DateTime.Now;
>       for (int i = 0; i < Count; i++)
>       {
>         MyValueType t = Activator.CreateInstance<MyValueType>();
>       }
>       Console.WriteLine("typed val:\t {0}", DateTime.Now.Ticks - now.Ticks);
> 
>       now = DateTime.Now;
>       for (int i = 0; i < Count; i++)
>       {
>         MyValueType t = (MyValueType)
> Activator.CreateInstance(typeof(MyValueType));
>       }
>       Console.WriteLine("untyped val:\t {0}", DateTime.Now.Ticks - now.Ticks);
> 
>       Console.ReadKey();
>     }
> 
>     class MyReferenceType
>     {
>       public int dummy;
>     }
> 
>     struct MyValueType
>     {
>       public int dummy;
>     }
>   }
> }
> 
> On 2/28/07, Frans Bouma <[EMAIL PROTECTED]> wrote:
> > I was benchmarking some type instantiation code, and I stumbled upon this:
> >
> > when I instantiate in a loop 1,000,000 times a class with the code:
> >
> > MyType t = Activator.CreateInstance<MyType>();
> >
> > it takes 2800ms or thereabout.
> >
> > When I use:
> > MyType t = (MyType)Activator.CreateInstance(typeof(MyType));
> >
> > it takes 330ms or thereabout
> >
> > (debug builds).
> >
> > why this big difference? The code internally (peeking with reflector) shows
> > two different code paths, though I then wonder, why isn't
> > Activator.CreateInstance<T> implemented as:
> >
> > public T CreateInstance<T>()
> > {
> >        return (T)Activator.CreateInstance(typeof(T));
> > }
> >
> > ?
> >
> >        FB
> >
> > ===================================
> > This list is hosted by DevelopMentor(r)  http://www.develop.com
> >
> > View archives and manage your subscription(s) at http://discuss.develop.com
> >
> 
> 
> --
> Sébastien
> www.sebastienlorion.com

===================================
This list is hosted by DevelopMentor�  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to