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