【问题标题】:Static methods in C#?C#中的静态方法?
【发布时间】:2009-12-14 06:11:47
【问题描述】:

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

【问题讨论】:

    标签: c# performance static-methods


    【解决方案1】:

    编辑:Eric cmets 对此here 进行了更多说明,并暗示有有时使用call...尽管请注意他的new() 示例isn't guaranteed ;- p


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

    obj.SomeMethod();
    

    没有抛出异常(对于obj=null 和未触及this 的非虚拟方法SomeMethod)。如果您更改了SomeMethod 的实现,那会很糟糕。当他们调查添加显式空值检查(即空值检查然后静态调用)的成本时,结果证明它与使用虚拟调用相同,所以他们这样做了,这使得它更加灵活和可预测的。

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

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

    【讨论】:

    • 我读过 C++ 编译器可以做到这一点,那么他们为什么不让 C# 编译器变得那么聪明呢?
    • 这与智能无关......就像我解释的那样,进行“空检查和静态调用”与“虚拟调用”(它有一个空-检查内置)。那么为什么要维护两个不同的选项呢?
    【解决方案2】:

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

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

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

    【讨论】:

    • 我希望我们的 C# 编译器足够聪明,可以像 C++ 编译器一样进行优化。谢谢解释!!
    【解决方案3】:

    见this question。

    摘录如下:

    静态调用速度快 4 到 5 倍 而不是每次都构造一个实例 调用实例方法的时间。 然而,我们仍然只是在谈论 每次调用大约几十纳秒

    【讨论】:

    • 请注意,这与为每个调用构造一个新实例相比;它不会比较更常见的情况,即为多次调用构建一个实例一次。
    • 如果您只是参考另一个问题的答案,为什么不将链接作为评论发布,或者作为副本投票?
    • 另请注意,那篇文章是在 2003 年发表的。从那时起,CLR 发生了很大变化。
    【解决方案4】:

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

    【讨论】:

    • C++ 编译器这样做,为什么不 .Net(C#) 编译器
    【解决方案5】:

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

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

    它们的总体性能非常小

    所以.......

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 你不需要静态变量来调用静态方法。它们是不同的概念。
      猜你喜欢
      • 2011-01-17
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2011-10-20
      相关资源
      最近更新 更多