对象创建的成本是多少

时间:2010-04-22 12:50:18

标签: asp.net performance architecture

如果我必须在静态方法和创建实例之间做出选择并使用实例方法,我将始终选择静态方法。但是创建实例的详细开销是什么?

例如,我看到了一个可以用静态类完成的DAL,但是他们选择在BLL中每次调用它们时调用类似的实例。

new Customer()。GetData();

这可能有多糟糕?

由于

2 个答案:

答案 0 :(得分:3)

性能损失应该可以忽略不计。在this blog entry中,有人做了一个简短的基准测试,结果是创建500,000个对象并将它们添加到列表中的成本大约为1.5秒。

所以,因为我认为new Customer().GetData();在单个BLL函数中最多会被调用几百次,所以可以忽略性能损失。

作为旁注,如果实际使用new Customer().GetData();,则类的设计或命名都会被破坏:如果类Customer只提供获取数据的方法,那么它应该被称为某种东西不同,如CustomerReader(缺少一个更好的名字)。另一方面,如果Customer具有实际代表客户的实例状态,GetData应该是静态的 - 不是出于性能原因,而是出于一致性的原因。

答案 1 :(得分:0)

通常,人们不应过于关注CLR中的对象创建开销。新对象的内存分配非常快(由于垃圾收集器的内存压缩阶段 - GC)。创建新对象将占用对象的一些内存并对GC施加更多压力(因为它必须清理对象),但如果它仅在短时间内使用,那么它可能会被收集到早期的GC生成并没有那么糟糕的性能。调用数据库也会使性能开销相形见绌。

一般情况下,我会决定是否为某些相关方法创建一个新对象,或者只是根据我对对象的需要使用静态类(和方法)(比如需要模拟/存根它)测试)而不是性能上的细微差别

作为旁注 - new Customer().GetData();是否是放置此类代码的正确位置是值得怀疑的 - 对我而言,返回的数据似乎与基于该语句的客户实例直接相关,而不是实际调用数据库检索数据。