Я встретился с одной проблемой производительности, которую я не могу вполне понять. Я знаю, как зафиксировать его, но я не понимаю, Почему это происходит. Это только для забавы!
Давайте говорить код. Я упростил код так, как я мог для репродуцирования проблемы.
Предположим, что у нас есть универсальный класс. Это имеет пустой список внутри и делает что-то с 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
метод от обоих классов. Доступ от производного типа в 4 раза медленнее это от базового класса. И я не могу понять, почему это происходит. Скомпилированный в режиме Release, результатом является то же с, нагреваются. Это происходит на.NET 4.5 только.
public class Program
{
public static void Main()
{
Measure(new DerivedClass());
Measure(new BaseClass
Полный список на сути