代码之家  ›  专栏  ›  技术社区  ›  viky

C中的静态方法

  •  3
  • viky  · 技术社区  · 15 年前

    与非静态方法相比,静态方法的性能关注点是什么?我已经读到静态方法在性能方面更好,但是我想知道,它们是如何更快的?如果一个方法不使用任何实例成员,那么我们的编译器应该处理它,并将其视为静态方法。

    6 回复  |  直到 15 年前
        1
  •  7
  •   Community basarat    7 年前

    编辑:Eric对此有更多评论 here 并暗示 有时 call 被使用…尽管注意到他的 new() 例子 isn't guaranteed -P


    在原始编译器(1.1之前版本)中,编译器 处理非虚拟实例方法(无 this )静态的;问题是这会导致一些奇怪的问题 null 检查,即

    obj.SomeMethod();
    

    没有 引发异常 obj=null 和非虚拟方法 SomeMethod 它没有接触 )如果你改变了 多种方法 . 当他们调查添加显式空检查(即空检查,然后是静态调用)的成本时,结果发现它与使用虚拟调用是一样的,因此他们这样做了,这使得它更加灵活和可预测。

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

    我认为在某一点上你可以发射IL来调用 有规律的 实例方法通过静态调用,但上次我尝试时得到了“哦,不,你不知道!”来自clr的消息(此操作可能会破坏运行时的稳定性);或者它们完全阻止了这一点,或者(也许更可能)我借用了自定义IL。

        2
  •  5
  •   Jaco Pretorius    15 年前

    是的,静态调用会更快-在调用方法之前不需要创建对象的实例。(尽管你显然不会注意到区别)

    实际上,如果编译器优化了一个方法(使实例方法成为静态的),这并不重要——除非已经创建了实例,否则不会调用实例方法,对吧?

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

        3
  •  3
  •   Community basarat    7 年前

    this question .

    摘录如下:

    静态调用速度快4到5倍 比构造一个实例 调用实例方法的时间。 不过,我们还是在谈 每次通话大约10纳秒

        4
  •  1
  •   Yuriy Faktorovich    15 年前

    我怀疑编译器会把它当作一个静态方法,尽管您可以自己检查。好处是不会创建实例。不用担心垃圾收集器。如果有静态构造函数,则只调用静态构造函数。

        5
  •  0
  •   Clover    15 年前

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

    购买如果您只创建一个实例并保存静态成员,那么性能是相等的

    它们的总性能很小

    所以…

        6
  •  0
  •   Vinay Pandey    15 年前

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

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