静态方法相对于非静态方法的性能问题是什么?我读过静态方法在性能方面更好,但我想知道它们为什么更快?如果一个方法没有使用任何实例成员,则编译器应该将其视为静态方法并处理。
编辑:Eric在这里进一步解释了这个问题,并暗示call
有时会被使用...虽然需要注意的是,他的new()
示例并不保证;-p
在原始编译器(1.1之前)中,编译器确实将没有this
的非虚拟实例方法视为静态方法;问题在于这导致了一些与null
检查相关的奇怪问题,即:
obj.SomeMethod();
没有 抛出异常(对于 obj=null
和非虚方法 SomeMethod
未访问 this
的情况)。如果你改变了 SomeMethod
的实现方式,这将是不好的。当他们调查添加显式空检查的成本时(即先进行空检查再进行静态调用),结果证明与使用虚拟调用是相同的,因此他们选择了后者,使其变得更加灵活和可预测。
请注意,如果 SomeMethod
是扩展方法(静态方法),那么"不抛出异常"也完全符合行为。
我认为在某个时候,您可以发出IL来通过静态调用调用一个常规实例方法,但是上次我尝试时,CLR给我返回了 "oh no you don't!" 消息(此操作可能会破坏运行时);要么他们完全阻止了这一点,要么(更有可能)是我搞坏了自定义的IL。
我怀疑编译器不会将其视为静态方法,但您可以自行检查。好处是不需要创建实例,无需担心垃圾收集器,如果有静态构造函数,则只需调用它。
静态方法很快,因为不需要构造实例。
如果你只需要创建一个实例并保存静态成员,那么性能是相等的。
它们在总体性能上非常小。
所以......
是的,静态方法很快,但静态变量所占用的内存不受GC控制,即使不需要也不会被释放,这是一个问题。
但最重要的是,您应该考虑应用程序的设计,因为内存和速度已经增加了几天,如果您不正确使用静态变量,则可能导致设计不佳。