我总是假设在构造具有大量额外构造开销的非平凡对象(例如,可能是db调用)时,使用CreateInstance的开销几乎可以忽略不计。
然而,在出现一些性能问题之后,我对一些代码进行了以下测试。 Node对象有两个构造函数 - 一个从头开始构造(非常昂贵),另一个只从数据库中读取先前构造的对象并对其进行反序列化。
超过10,000次迭代,“廉价”反序列化构造函数的性能几乎没有差异。对于昂贵的构造函数来说,它是巨大的(300%左右)。 Performance Explorer图表如下 - 绿色便宜,红色很贵,top是CreateInstance,bottom是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);
}