C# 为什么匿名方法在我的测试中更快?
我编写了两个简单的应用程序: 1.一个使用匿名方法,以及 2.一种是使用简单的方法 上述每个方法都在执行一个简单的操作:C# 为什么匿名方法在我的测试中更快?,c#,.net,clr,C#,.net,Clr,我编写了两个简单的应用程序: 1.一个使用匿名方法,以及 2.一种是使用简单的方法 上述每个方法都在执行一个简单的操作: int add(int n1, int n2) {return n1+n2} 我调用了一个简单的for循环,它将调用add方法10000次。使用匿名方法的实现比其他方法花费的时间少得多。为什么?是因为抖动包含匿名方法吗 delegate int ADD( int i1, int i2 ); private void button1_Click( object sende
int add(int n1, int n2) {return n1+n2}
我调用了一个简单的for循环,它将调用add方法10000次。使用匿名方法的实现比其他方法花费的时间少得多。为什么?是因为抖动包含匿名方法吗
delegate int ADD( int i1, int i2 );
private void button1_Click( object sender, EventArgs e )
{
Stopwatch watch = new Stopwatch();
watch.Reset();
watch.Start();
for( int i = 0 ; i < 10000 ; i++ )
{
add( i, i );
}
watch.Stop();
Console.WriteLine("Normal Call " + watch.ElapsedTicks);
watch.Reset();
watch.Start();
for( int i = 0 ; i < 10000 ; i++ )
{
ADD p = delegate( int n1, int n2 )
{
return n1 + n2;
};
p.Invoke( i, i );
}
watch.Stop();
Console.WriteLine( watch.ElapsedTicks );
Console.ReadLine();
}
int add(int n1, int n2)
{
return n1 + n2;
}
}
我无法证实你的结果 在我的测试中,普通函数的性能比委托函数好大约一个数量级。下面是我用于测试的经过轻微修改的代码:
class Program {
delegate int ADD(int i1, int i2);
static int add(int n1, int n2) {
return n1 + n2;
}
static void Main(string[] args) {
Stopwatch watch = new Stopwatch();
watch.Start();
const int count = 100000;
for (int i = 0; i < count; i++) {
add(i, i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedTicks);
ADD p = delegate(int n1, int n2) {
return n1 + n2;
};
watch.Reset();
watch.Start();
for (int i = 0; i < count; i++) {
p.Invoke(i, i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedTicks);
}
}
你一定是在做一些扭曲结果的事情
--编辑--
好的,我已经做了另一轮测试,这次是一个WinForms应用程序
当WinForms应用程序编译为“x86”时,结果与上面的控制台应用程序相同。函数比委托更快。
当WinForms被编译为“x64”时,函数的速度会急剧降低,大致达到委托的级别。
当函数被设置为静态时,它会在“x64”WinForms build中再次加速。
上面的控制台应用程序从不减速,即使是在“x64”版本中,甚至是在功能变为非静态时。
所有内容都是在版本配置中的调试器外部测量的。只有1000次?任何现代计算机都能在不到一毫秒的时间内完成这项工作。另一方面,计算机中的时钟很难测量这么小的时间间隔。请张贴您的计时代码。这里没有足够的信息来回答这个问题。您是否处于发布或调试模式。我使用秒表进行控制台。写入循环运行的时间-在发布和调试时使用“匿名方法”比常规方法更费时。您是在Visual Studio内部还是外部运行?调试器将阻止JIT优化,甚至在版本配置中也会扭曲结果。另外,add是在接口中声明然后在类中实现,还是只是一个直接的类级方法?我知道JIP优化。。。我说的是发布模式,我不认为他歪曲了结果;我认为他看错了,认为最上面一行是代表的结果,最下面一行是方法的结果。不-请看我修复代码-然后再尝试运行它!“正常”代码运行较慢@这是WinForms还是console应用程序?winform-操作是通过按下按钮进行的@Gabe不,我已经确认了他的结果,请参见编辑。WinForms应用程序的“x64”版本中出现了一些奇怪的情况。
class Program {
delegate int ADD(int i1, int i2);
static int add(int n1, int n2) {
return n1 + n2;
}
static void Main(string[] args) {
Stopwatch watch = new Stopwatch();
watch.Start();
const int count = 100000;
for (int i = 0; i < count; i++) {
add(i, i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedTicks);
ADD p = delegate(int n1, int n2) {
return n1 + n2;
};
watch.Reset();
watch.Start();
for (int i = 0; i < count; i++) {
p.Invoke(i, i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedTicks);
}
}
103
1321