CreateInstance开销 - 它是否超出了对象构造(可能是实体框架)?

时间:2018-06-13 10:39:35

标签: entity-framework system.reflection createinstance

我总是假设在构造具有大量额外构造开销的非平凡对象(例如,可能是db调用)时,使用CreateInstance的开销几乎可以忽略不计。

然而,在出现一些性能问题之后,我对一些代码进行了以下测试。 Node对象有两个构造函数 - 一个从头开始构造(非常昂贵),另一个只从数据库中读取先前构造的对象并对其进行反序列化。

超过10,000次迭代,“廉价”反序列化构造函数的性能几乎没有差异。对于昂贵的构造函数来说,它是巨大的(300%左右)。 Performance Explorer图表如下 - 绿色便宜,红色很贵,top是CreateInstance,bottom是new()。

Performance Explorer Output

这对任何人都有意义吗 - 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 个答案:

没有答案