代码之家  ›  专栏  ›  技术社区  ›  Mark Rogers

除了减少内存使用之外,静态函数是否比非静态函数性能更好?

  •  42
  • Mark Rogers  · 技术社区  · 15 年前

    我想 public private static 由于内存中只有静态目标的一个副本,因此目标的内存使用率必须降低。

    这似乎是因为一个方法是静态的,它可能使该方法成为clr编译器进一步优化的潜在点,而不是使用非静态函数所能实现的。不过,这只是一个站不住脚的理论,所以我来问你们。

    静止的 公众的 私有的 除了减少内存使用之外,方法还能提供任何性能上的好处?

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

    5 回复  |  直到 15 年前
        1
  •  51
  •   Adriaan Stander    15 年前

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

    对静态方法的调用生成 Microsoft中的调用指令 中间语言(MSIL),然而 对实例方法的调用将生成 callvirt指令,它也 检查空对象引用。 然而,大多数时候 两者的性能差异 不重要。

        2
  •  24
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    除了astander所说的之外,您的问题还暗示了对实例方法的误解。不管函数是否是静态的,只有 内存中函数代码的副本。必须通过对象调用非静态方法,但该对象不携带该方法的私有副本。因此,静态方法和非静态方法的内存使用实际上是相同的,而且正如其他人指出的那样,性能特征几乎相同。

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

        3
  •  18
  •   Christian Madsen    15 年前

    这个话题有点离题,但也同样重要。

    制作方法的选择 静止的 实例 不应该基于执行时间(这似乎无关紧要)。它应该基于方法是否在对象上操作。例如,所有math.*方法都是静态的,而(大多数)string.*方法是实例,因为它们操作的是string实例。我的个人哲学: 一个好的设计应该能弥补其他地方可能节省下来的几个周期

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

    嘿,从我的壁炉里拿出来感觉真好。

        4
  •  1
  •   Community CDub    8 年前

    好的答案-基本上没有关系,这是几乎所有这类问题的答案。即使它确实起到了作用——如果程序的执行时间花费了1美元,这种问题也可能只花费1美分,而且 很有可能 还有其他事情 costing a great deal more

        5
  •  0
  •   Jesse C. Slicer    15 年前

    MeasureIt 可以肯定的是,除非你正在创建一个覆盖全球的超高容量事务处理超级计算集群,否则它不会有明显的区别。