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

Mar*_*ers 42 c# optimization performance static keyword

我假设public或者private static目标必须减少内存使用量,因为内存中只有一个静态目标副本.

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

static publicprivate方法提供了超越减少内存使用量增加的任何性能优势?

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

Adr*_*der 51

来自静态类和静态类成员(C#编程指南)

对静态方法的调用会生成Microsoft中间语言(MSIL)中的调用指令,而对实例方法的调用会生成callvirt指令,该指令还会检查空对象引用.但是,大多数时候两者之间的性能差异并不显着.

  • 在现代体系结构中,分支预测器以接近零的开销来进行空检查. (13认同)

JSB*_*ոգչ 24

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

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

  • 非静态方法将`this`作为隐藏参数传入,因此有人可能会狡辩说它使用了更多的堆栈空间.但这似乎并不特别重要. (3认同)

Chr*_*sen 18

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

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

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

哎呀,从壁炉里拿出来感觉很好.

  • -1因为我厌倦了那些有合法优化/性能问题的人只是被告知"不要这样做".有时微观优化**也很重要. (7认同)
  • 简单规则:如果方法或属性不访问任何实例状态(`this`及其成员),它应该是静态的. (6认同)
  • 嗯,他对涉及优化的问题是正确的.避免过早优化是一个很好的建议,但人们在发布时会有一个触发器.不幸的是,谈论"过早优化"有多糟糕,并没有给我关于我问的问题的新信息."过早"这个词告诉你,在某些时候,优化可能是必要的.如果您遇到一个方法的性能问题,您连续多次调用它并且它没有触及实例变量.将其声明为主要用于样式而非用于优化可能是有意义的. (2认同)
  • @dsimcha,我完全同意.微观优化有时很重要.但是,我在C#/ .Net(在大多数情况下也适用于嵌入式/低级环境)等高级语言/环境中开发的经验是,强大的设计更为重要.这是我自己的个人经历,但我相信很多程序员都有相同的经历. (2认同)