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杂志带来了所有的问题。用两种方式编写代码。拿出秒表。那你就知道了。我正在和作者核实是否还有其他地方他把它放在网上了。同时,你可以在右边阅读,谢谢,我也查看了他当前的博客,但现在已经不在了。