静态方法相对于非静态方法的性能问题是什么?我读过静态方法在性能方面更好,但我想知道它们如何更快?如果一个方法没有使用任何实例成员,那么我们的编译器应该处理它并将其视为静态方法。
6 回答
编辑:埃里克在这里对此进行了更多评论,并暗示有时会call
使用...尽管请注意,不能保证new()
他的示例;-p
在原始编译器(1.1 之前)中,编译器确实将非虚拟实例方法(不带this
)视为静态的;问题是这会导致一些奇怪的null
检查问题,即
obj.SomeMethod();
没有抛出异常(for obj=null
and non-virtual method SomeMethod
which didn't touch this
)。如果您更改了SomeMethod
. 当他们调查添加显式空检查(即先空检查然后静态调用)的成本时,结果证明它与使用虚拟调用相同,所以他们这样做了,这使得它更加灵活和可预见。
请注意,如果是扩展方法(静态),“不要抛出异常”也完全是行为。SomeMethod
我认为在某一时刻,您可以发出 IL 以通过静态调用调用常规实例方法,但上次我尝试时,我得到了“哦,不,你没有!” 来自 CLR 的消息(此操作可能会破坏运行时的稳定性);要么他们完全阻止了这一点,要么(也许更有可能)我破坏了自定义 IL。
是的,静态调用会更快——您不需要在调用方法之前创建对象的实例。(虽然你显然不会注意到差异)
实际上,编译器是否优化方法(使实例方法静态)并不重要——除非您已经创建了实例,否则您不会调用实例方法,对吗?
归根结底,您应该尝试优化代码的可维护性,而不是尝试在这里或那里节省 3 纳秒。
我怀疑编译器会将其视为静态方法,尽管您可以自己检查。好处是不会创建实例。无需担心垃圾收集器。并且只有静态构造函数被调用,如果有的话。
是的,静态方法很快,但是静态变量获取的内存不受GC控制,即使不需要也不会释放,所以这是一个问题。
但最重要的是,您应该考虑 allpication 的设计,因为内存和速度已经增加了几天,但是如果您不正确使用静态变量,您的设计可能会很糟糕。
静态方法很快,因为构造了一个实例
如果您只创建一个实例并保存静态成员,则购买,性能相同
它们的总体性能非常小
所以 .......