除了减少内存使用外,C#静态函数的性能是否优于非静态函数?

时间:2010-02-16 17:32:02

标签: c# performance optimization static keyword

我认为publicprivate static目标必须减少内存使用量,因为内存中只有一个静态目标副本。

似乎因为一个方法是静态的,可能使该方法成为CLR编译器进一步优化的潜在点,超出了非静态函数的可能性。虽然只是一个脆弱的理论,所以我来问你们所有人。

除了减少内存使用量之外,static publicprivate方法能否提供更高的性能优势?

(注意:我对那些谈论过早优化问题的回答不感兴趣。当然,这是我每天都遵循的合理建议,但这并不意味着有时不需要优化。(双重否定!)。允许我至少放纵我的好奇心

5 个答案:

答案 0 :(得分:51)

来自Static Classes and Static Class Members (C# Programming Guide)

  

对静态方法的调用会生成一个   微软的电话指令   中间语言(MSIL),而   生成一个实例方法的调用   一个callvirt指令,也是   检查空对象引用。   但是,大部分时间都是   两者之间的表现差异   并不重要。

答案 1 :(得分:24)

除了旁观者所说的,你的问题暗示了对实例方法的误解。无论函数是否为静态函数,内存中只有一个函数代码副本。必须通过对象调用非静态方法,但该对象不携带自己的方法私有副本。因此,静态和非静态方法的内存使用实际上是相同的,正如其他人所指出的那样,性能特征几乎相同。

但是,

非静态成员变量对于您创建的每个对象都单独存在。但是担心内存使用几乎总是浪费时间,除非你的程序中确实存在与内存相关的问题。

答案 2 :(得分:18)

这有点偏离主题,但同样重要。

制作方法静态实例的选择不应基于执行时间(无论如何似乎无关紧要)。它应该基于该方法是否对某个对象进行操作。例如,所有Math。*方法都是静态的,例如, (大多数)String。*方法是实例,因为它们在String实例上运行。我的个人理念:一个好的设计应该弥补可能在其他地方保存的几个周期

关于这个主题的另一种看法:我最近与一个被告知静态方法是邪恶的人合作,因为他们把我们带回到程序式编程的黑暗时代,因此应该不惜一切代价避免。这导致了类的奇怪示例,这些类需要实例来访问对象内部完全没有兴趣的方法。

p,从壁炉里拿出来感觉很好。

答案 3 :(得分:1)

好的答案 - 基本上没关系,这几乎是这类问题的答案。即使它确实有所作为 - 如果你的程序的执行时间花费一美元,这种问题可能花费一小部分,并且很可能还有其他的事情{ {3}}

答案 4 :(得分:0)

MeasureIt可以肯定,但除非你创建一个跨越全球范围的超大容量事务处理超级计算群集,否则你会发现它不会产生明显的差异。