Скорость reflection vs. operator new
От: nikov США http://www.linkedin.com/in/nikov
Дата: 14.11.07 16:41
Оценка: 85 (13)
Хочу продемонстрировать эксперимент, результат которого меня несколько удивил.

using System;
using System.Diagnostics;

class Program
{
    const int ITERATION_COUNT = 100000;

    static void Main()
    {
        TestReflection();
        TestGenericNew<Exception>();
    }

    static void TestReflection()
    {
        Stopwatch s = new Stopwatch();
        s.Start();
        for (int i = 0; i < ITERATION_COUNT; i++)
        {
            Exception ex = (Exception) Activator.CreateInstance(typeof(Exception));
        }
        s.Stop();
        Console.WriteLine(s.ElapsedTicks);
    }

    static void TestGenericNew<T>() where T : Exception, new()
    {
        Stopwatch s = new Stopwatch();
        s.Start();
        for (int i = 0; i < ITERATION_COUNT; i++)
        {
            Exception ex = new T();
        }
        s.Stop();
        Console.WriteLine(s.ElapsedTicks);
    }
}


Результаты:

100040189
762155730


То есть вызов оператора new оказался более чем в 7 раз медленнее, чем создание объекта через reflection.
Я знал, что оператор new c типами-параметрами тоже реализован через reflection, но не ожидал, что так неэффективно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.