我认为public
或private
static
目标必须减少内存使用量,因为内存中只有一个静态目标副本。
似乎因为一个方法是静态的,可能使该方法成为CLR编译器进一步优化的潜在点,超出了非静态函数的可能性。虽然只是一个脆弱的理论,所以我来问你们所有人。
除了减少内存使用量之外,static
public
或private
方法能否提供更高的性能优势?
(注意:我对那些谈论过早优化问题的回答不感兴趣。当然,这是我每天都遵循的合理建议,但这并不意味着有时不需要优化。(双重否定!)。允许我至少放纵我的好奇心
答案 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可以肯定,但除非你创建一个跨越全球范围的超大容量事务处理超级计算群集,否则你会发现它不会产生明显的差异。