实例方法和扩展方法之间是否存在性能差异?
答案 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一篇略显陈旧但又很好的文章