Затраты на CreateInstance - выходят ли за рамки конструкции объекта (может быть Entity Framework)?

Я всегда предполагал, что при создании нетривиальных объектов, которые будут иметь значительные дополнительные накладные расходы на конструирование (например, вызов db), что издержки использования CreateInstance будут в значительной степени незначительными.

Однако после того, как возникли некоторые проблемы с производительностью, я провел следующий тест для некоторого кода. Объект Node имеет два конструктора - один, который создает конструкцию с нуля (очень дорого), а другой, который просто считывает ранее созданный объект из базы данных и десериализует его.

За 10000 итераций практически нет различий в производительности "дешевого" конструктора десериализации. Для дорогого конструктора это огромно (300% или около того). График Performance Explorer ниже - зеленый - дешево, красный - дорого, top - CreateInstance, снизу - new().

Выход из Performance Explorer

Имеет ли это какой-либо смысл для кого-либо - может ли 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);
        }

0 ответов

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