Производительность: введите полученный из дженерика

Я встретился с одной проблемой производительности, которую я не могу вполне понять. Я знаю, как зафиксировать его, но я не понимаю, Почему это происходит. Это только для забавы!
Давайте говорить код. Я упростил код так, как я мог для репродуцирования проблемы.
Предположим, что у нас есть универсальный класс. Это имеет пустой список внутри и делает что-то с T в конструкторе. Это имеет Run метод, который звонит IEnumerable метод в списке, например. Any().

public class BaseClass
{
    private List _list = new List();

    public BaseClass()
    {
        Enumerable.Empty();
        // or Enumerable.Repeat(new T(), 10);
        // or even new T();
        // or foreach (var item in _list) {}
    }

    public void Run()
    {
        for (var i = 0; i < 8000000; i++)
        {
            if (_list.Any())
            // or if (_list.Count() > 0)
            // or if (_list.FirstOrDefault() != null)
            // or if (_list.SingleOrDefault() != null)
            // or other IEnumerable method
            {
                return;
            }
        }
    }
}

Затем у нас есть производный класс, который пуст:

public class DerivedClass : BaseClass
{
}

Давайте измерим уровень выполнения ClassBase.Run метод от обоих классов. Доступ от производного типа в 4 раза медленнее это от базового класса. И я не могу понять, почему это происходит. Скомпилированный в режиме Release, результатом является то же с, нагреваются. Это происходит на.NET 4.5 только.

public class Program
{
    public static void Main()
    {
        Measure(new DerivedClass());
        Measure(new BaseClass());
    }

    private static void Measure(BaseClass baseClass)
    {
        var sw = Stopwatch.StartNew();
        baseClass.Run();
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);
    }
}

Полный список на сути

63
задан 30 November 2014 в 15:55

0 ответов

Другие вопросы по тегам:

Похожие вопросы: