Затраты на CreateInstance - выходят ли за рамки конструкции объекта (может быть Entity Framework)?
Я всегда предполагал, что при создании нетривиальных объектов, которые будут иметь значительные дополнительные накладные расходы на конструирование (например, вызов db), что издержки использования CreateInstance будут в значительной степени незначительными.
Однако после того, как возникли некоторые проблемы с производительностью, я провел следующий тест для некоторого кода. Объект Node имеет два конструктора - один, который создает конструкцию с нуля (очень дорого), а другой, который просто считывает ранее созданный объект из базы данных и десериализует его.
За 10000 итераций практически нет различий в производительности "дешевого" конструктора десериализации. Для дорогого конструктора это огромно (300% или около того). График Performance Explorer ниже - зеленый - дешево, красный - дорого, top - CreateInstance, снизу - new().
Имеет ли это какой-либо смысл для кого-либо - может ли CreateInstance нести накладные расходы, которые будут влиять на что-то другое? Одна мысль заключалась в том, что объект Node управляет некоторыми объектами Entity Framework - может ли это ударить?
// Expensive calls
NodeCreationOptions opt = new NodeCreationOptions();
List<Node> n1 = new List<Node>();
for (int i = 0; i < 10000; i++)
{
n1.Add(new Node(m_xc, opt));
}
List<Node> n2 = new List<Node>();
Type t = typeof(Node);
var p = new Object[] { m_xc, new NodeCreationOptions() };
for (int i = 0; i < 10000; i++)
{
n2.Add(Activator.CreateInstance(t, p) as Node);
}
// Cheap calls
p = new Object[] { m_xc, dbRec};
List<Node> n3 = new List<Node>();
for (int i = 0; i < 10000; i++)
{
n3.Add(new Node(m_xc, dbRec));
}
List<Node> n4 = new List<Node>();
for (int i = 0; i < 10000; i++)
{
n4.Add(Activator.CreateInstance(t, p) as Node);
}