【发布时间】:2011-08-13 05:48:01
【问题描述】:
我假设lambda functions、delegates 和anonymous functions 具有相同的主体将具有相同的“速度”,但是,运行以下简单程序:
static void Main(string[] args)
{
List<int> items = new List<int>();
Random random = new Random();
for (int i = 0; i < 10000000; i++)
{
items.Add(random.Next());
}
Stopwatch watch;
IEnumerable<int> result;
Func<int, bool> @delegate = delegate(int i)
{
return i < 500;
};
watch = Stopwatch.StartNew();
result = items.Where(@delegate);
watch.Stop();
Console.WriteLine("Delegate: {0}", watch.Elapsed.TotalMilliseconds);
Func<int, bool> lambda = i => i < 500;
watch = Stopwatch.StartNew();
result = items.Where(lambda);
watch.Stop();
Console.WriteLine("Lambda: {0}", watch.Elapsed.TotalMilliseconds);
watch = Stopwatch.StartNew();
result = items.Where(i => i < 500);
watch.Stop();
Console.WriteLine("Inline: {0}", watch.Elapsed.TotalMilliseconds);
Console.ReadLine();
}
我明白了:
委托:4.2948 毫秒
Lambda:0.0019 毫秒
匿名:0.0034 毫秒
虽然可以忽略不计,但为什么这三种(显然相同)的方法以不同的速度运行?幕后发生了什么?
更新:
根据 cmets 的建议,以下通过调用 ToList() 来“强制”Where。此外,还添加了一个循环以提供更多的运行数据:
while (true)
{
List<int> items = new List<int>();
Random random = new Random();
for (int i = 0; i < 10000000; i++)
{
items.Add(random.Next());
}
Stopwatch watch;
IEnumerable<int> result;
Func<int, bool> @delegate = delegate(int i)
{
return i < 500;
};
watch = Stopwatch.StartNew();
result = items.Where(@delegate).ToList();
watch.Stop();
Console.WriteLine("Delegate: {0}", watch.Elapsed.TotalMilliseconds);
Func<int, bool> lambda = i => i < 500;
watch = Stopwatch.StartNew();
result = items.Where(lambda).ToList();
watch.Stop();
Console.WriteLine("Lambda: {0}", watch.Elapsed.TotalMilliseconds);
watch = Stopwatch.StartNew();
result = items.Where(i => i < 500).ToList();
watch.Stop();
Console.WriteLine("Inline: {0}", watch.Elapsed.TotalMilliseconds);
Console.WriteLine(new string('-', 12));
}
上面的代码导致每个函数大约需要 120 毫秒。
【问题讨论】:
-
只是出于好奇,您是否尝试过以不同的顺序运行这 3 个?
-
添加预热期并运行所有测试几个周期(全部大循环)并强制在哪里。在这些更改之后,我没有发现任何明显的差异。
-
这段代码中
@的作用是什么? (@delegate) -
@Omar:您显示的代码肯定不会花费 120 毫秒 - 我建议您编辑代码以显示您如何“强制”在哪里。跨度>
-
@Mikael:谢谢 - 不知道你能做到。
标签: c# delegates anonymous-function lambda