性能扩展方法与实例方法

时间:2009-07-28 17:58:52

标签: c# asp.net

实例方法和扩展方法之间是否存在性能差异?

4 个答案:

答案 0 :(得分:17)

不要忘记扩展方法只是包含在语法糖中的静态方法调用。所以你真正要问的是

  

静态和实例方法之间是否存在性能差异

答案是肯定的,有关此主题的各种文章

一些链接

答案 1 :(得分:5)

我怀疑会有任何性能差异,因为它都是语法糖。编译器只是像任何其他方法调用一样编译它,除了它是一个不同类的静态方法。

我的博客中有关语法糖的更多细节:http://colinmackay.co.uk/2007/06/18/method-extensions/

答案 2 :(得分:3)

它没有任何显着差异。请参阅this article

我已经验证了测试结果,并进行了另一项测试,其中静态变体的参数类型为Sample。所有这些都在我的系统上花了11495毫秒(+/- 4毫秒)进行21亿次通话。正如文章所说,你不应该担心这一点。

此处的大多数示例和测试都无效,因为它们允许方法内联。如果方法为空,则编译器特别容易;)

(有趣的是,我的系统上的测试比文章中的测试速度慢..它不是很慢,但可能是因为64位操作系统)

答案 3 :(得分:0)

由于传递给方法的参数数量存在轻微的性能差异。例如,查看以下类:

public class MyClassInstance
{
    public int MyProperty { get; set; }

    public MyClassInstance(int prop)
    {
        MyProperty = prop;
    }

    public void IncrementInstance()
    {
        MyProperty++;
    }
}

public static class MyClassStatic
{
    public static void IncrementStatic(this MyClassInstance i)
    {
        i.MyProperty++;
    }
}

运行以下代码:

        DateTime d = DateTime.Now;

        MyClassInstance i = new MyClassInstance(0);

        for (int x = 0; x < 10000000; x++)
        {
            i.IncrementInstance();
        }

        TimeSpan td = d - DateTime.Now;

        DateTime e = DateTime.Now;

        for (int x = 0; x < 10000000; x++)
        {
            i.IncrementStatic();
        }

        TimeSpan te = e - DateTime.Now;

td = .2499秒

te = .2655 sec

由于实例方法不必传递任何参数。

heres一篇略显陈旧但又很好的文章