Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 性能扩展方法与实例方法_C#_Asp.net - Fatal编程技术网

C# 性能扩展方法与实例方法

C# 性能扩展方法与实例方法,c#,asp.net,C#,Asp.net,实例方法和扩展方法之间是否有任何性能差异?我怀疑是否有任何性能差异,因为它们都是语法上的糖分。编译器只是像任何其他方法调用一样编译它,除了它是对另一个类上的静态方法 我博客中关于语法糖的更多细节:别忘了扩展方法只是用语法糖包装的静态方法调用。所以你真正想问的是 静态方法和实例方法之间是否存在性能差异 答案是肯定的,关于这个问题有各种各样的文章 一些链接 由于传递到方法中的参数数量不同,性能略有差异。例如,查看以下类: public class MyClassInstance { p

实例方法和扩展方法之间是否有任何性能差异?

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


我博客中关于语法糖的更多细节:

别忘了扩展方法只是用语法糖包装的静态方法调用。所以你真正想问的是

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

答案是肯定的,关于这个问题有各种各样的文章

一些链接


由于传递到方法中的参数数量不同,性能略有差异。例如,查看以下类:

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;
DateTime d=DateTime.Now;
MyClassInstance i=新的MyClassInstance(0);
对于(int x=0;x<10000000;x++)
{
i、 IncrementInstance();
}
TimeSpan td=d—DateTime.Now;
DateTime e=DateTime.Now;
对于(int x=0;x<10000000;x++)
{
i、 递增静态();
}
TimeSpan te=e-DateTime.Now;
td=0.2499秒

te=0.2655秒

因为实例方法不必传递任何参数


一篇关于性能的稍微过时但很好的文章

它没有任何显著的区别。看

我已经验证了测试结果,并做了另一个测试,其中静态变量的参数类型为
Sample
。所有这些电话在我的系统上占用了11495ms(+/-4ms),通话量为21亿次。正如文章所说,你不应该担心这一点

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


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

-1在你的博客中,你正在比较静态方法和静态方法。这与实例方法不同……那篇博客文章是两年前写的,它的目的不是回答这个确切的问题。我的加入仅仅是为了通过展示底层IL和扩展方法的工作原理来证明扩展方法是语法糖。但是,谢谢你的否决票!实例方法调用中的“this”引用会发生什么变化?那去哪了?这是怎么通过的?该方法需要从某处获取它?本质上,IncrementInstance和IncrementStatic都调用MyProperty属性的Set方法。instance方法直接引用实例内存,而static方法引用作为参数传入的实例。当我使用与您相同的迭代次数时,这些数字会相互叠加。有时实例方法获胜,有时扩展方法获胜。我认为计时器不够好,所以我将迭代次数设置为超过20亿次(int.MaxValue),现在得到了相当一致的结果。使用实例方法的迭代需要46纳秒完成,使用扩展方法的迭代需要45纳秒完成。我不认为我会基于毫微秒的差异以这种或那种方式优化任何东西。你的计算机似乎比我的更快:)他他我应该注意到我使用Visual Studio调试器运行了它,并在分配te后放置了一个断点。不过,我同意,扩展方法的有用性几乎总是大于您受到的性能影响。这不像是反射,因为它的速度较慢。这是一个非常小的区别。@MarkSynowiec关键是,实例方法如何知道“实例内存”在哪里?答案是:它作为隐藏参数传递。这意味着两种方法实际上都有相同数量的参数,至少在性能方面是这样。我希望你能在这些文章中添加一些引用,因为我还没有找到任何引用。也许我在谷歌上输入了错误的术语。@Colin我也是:)。我想我上次没打投稿。尝试用谷歌搜索“CLR方法调用性能”大多数文章都采用一般的方法,但会讨论实例与静态的区别。你能更具体一点吗?链接只是给MSDN杂志带来了所有的问题。用两种方式编写代码。拿出秒表。那你就知道了。我正在和作者核实是否还有其他地方他把它放在网上了。同时,你可以在右边阅读,谢谢,我也查看了他当前的博客,但现在已经不在了。