我写了两个简单的应用程序: 1.一个使用匿名方法,和 2.一个人用简单的方法。
上述每种方法都在做一个简单的操作:
int add(int n1, int n2) {return n1+n2}
我调用一个简单的for
循环,将add
方法调用10,000次。使用匿名方法的实现比其他方法花费的时间少得多。为什么?是因为JITter内联匿名方法吗?
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;
}
}
结果 - 在发布模式下 - 在x64上编译(按动作按钮几次):
Normal 1525
1275
Normal 480
477
Normal 371
370
Normal 372
371
Normal 477
479
Normal 477
477
Normal 564
702
Normal 478
476
答案 0 :(得分:2)
我无法确认您的结果。
在我的测试中,“普通”功能比委托更好地执行大约数量级。以下是我用于测试的略微修改的代码:
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
你必须做一些扭曲结果的事情。
---编辑---
好的我已经进行了另一轮测试,这次使用的是WinForms应用程序。
static
时,它再次加速(在'x64'WinForms构建中)。在Release配置中,所有内容都在调试器外部进行了测量。