如果我必须在静态方法和创建实例之间做出选择并使用实例方法,我将始终选择静态方法。但是创建实例的详细开销是什么?
例如,我看到了一个可以用静态类完成的DAL,但是他们选择在BLL中每次调用它们时调用类似的实例。new Customer()。GetData();
这可能有多糟糕?
由于
答案 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();
是否是放置此类代码的正确位置是值得怀疑的 - 对我而言,返回的数据似乎与基于该语句的客户实例直接相关,而不是实际调用数据库检索数据。