3

静态方法相对于非静态方法的性能问题是什么?我读过静态方法在性能方面更好,但我想知道它们如何更快?如果一个方法没有使用任何实例成员,那么我们的编译器应该处理它并将其视为静态方法。

4

6 回答 6

7

编辑:埃里克在这里对此进行了更多评论,并暗示有时call使用...尽管请注意,不能保证new()他的示例;-p


在原始编译器(1.1 之前)中,编译器确实将非虚拟实例方法(不带this)视为静态的;问题是这会导致一些奇怪的null检查问题,即

obj.SomeMethod();

没有抛出异常(for obj=nulland non-virtual method SomeMethodwhich didn't touch this)。如果您更改了SomeMethod. 当他们调查添加显式空检查(即先空检查然后静态调用)的成本时,结果证明它与使用虚拟调用相同,所以他们这样做了,这使得它更加灵活和可预见。

请注意,如果是扩展方法(静态),“不要抛出异常”也完全是行为。SomeMethod

我认为在某一时刻,您可以发出 IL 以通过静态调用调用常规实例方法,但上次我尝试时,我得到了“哦,不,你没有!” 来自 CLR 的消息(此操作可能会破坏运行时的稳定性);要么他们完全阻止了这一点,要么(也许更有可能)我破坏了自定义 IL。

于 2009-12-14T06:18:33.140 回答
5

是的,静态调用会更快——您不需要在调用方法之前创建对象的实例。(虽然你显然不会注意到差异)

实际上,编译器是否优化方法(使实例方法静态)并不重要——除非您已经创建了实例,否则您不会调用实例方法,对吗?

归根结底,您应该尝试优化代码的可维护性,而不是尝试在这里或那里节省 3 纳秒。

于 2009-12-14T07:01:50.930 回答
3

看到这个问题

这是摘录:

每次调用实例方法时,静态调用比构造实例快 4 到 5 倍。但是,我们仍然只谈论每次调用几十纳秒

于 2009-12-14T06:13:17.763 回答
1

我怀疑编译器会将其视为静态方法,尽管您可以自己检查。好处是不会创建实例。无需担心垃圾收集器。并且只有静态构造函数被调用,如果有的话。

于 2009-12-14T06:15:02.183 回答
0

是的,静态方法很快,但是静态变量获取的内存不受GC控制,即使不需要也不会释放,所以这是一个问题。

但最重要的是,您应该考虑 allpication 的设计,因为内存和速度已经增加了几天,但是如果您不正确使用静态变量,您的设计可能会很糟糕。

于 2009-12-14T07:47:43.130 回答
0

静态方法很快,因为构造了一个实例

如果您只创建一个实例并保存静态成员,则购买,性能相同

它们的总体性能非常小

所以 .......

于 2009-12-14T06:32:53.467 回答