我在一个数组上工作,我必须循环它。首先,我使用lambda ForEach
Array
.ForEach<int>( array, ( int counter ) => {
Console.WriteLine( counter );
} );
然后我使用简单的foreach
。
我发现简单foreach
比lambda ForEach
快得多,但当我使用通用列表测试时,ForEach
比简单foreach
更快。
为什么使用foreach
的数组对象上的循环比lambda ForEach
快?
更新:
我在数组上测试
答案 0 :(得分:3)
我在测试中发现lambda更快。复制粘贴MSDN秒表代码并用两个版本的迭代列表进行装饰....(我还改变了首先测试的顺序,我得到了相同的时间)。使用lambda的基于Linq的迭代变得更快。
Lambda 00:00:00.49
foreach 00:00:00.58
和代码..
var list = Enumerable.Range(0, 100000000).ToArray();
var total = 0;
var stopWatch = new Stopwatch();
stopWatch.Start();
Array.ForEach(list, x => total += x);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
stopWatch = new Stopwatch();
stopWatch.Start();
foreach (var i in list)
{
total += i;
}
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
答案 1 :(得分:3)
我编辑了Keith的代码 - 在我的机器foreach
上执行的速度比Array.ForEach
快了六倍:
class Program
{
static void Main(string[] args)
{
Benchmark(50);
}
private static void Benchmark(int iterations)
{
int[] list = Enumerable.Range(0, 100000000).ToArray();
long sum = 0;
for (int i = 0; i < iterations; i++)
{
sum += ArrayForeach(list);
}
Console.WriteLine("ForEach " + sum / iterations);
sum = 0;
for (int i = 0; i < iterations; i++)
{
sum += Foreach(list);
}
Console.WriteLine("foreach " + sum / iterations);
}
private static long Foreach(int[] list)
{
long total = 0;
var stopWatch = Stopwatch.StartNew();
foreach (var i in list)
{
total += i;
}
stopWatch.Stop();
return stopWatch.ElapsedTicks;
}
private static long ArrayForeach(int[] list)
{
long total = 0;
var stopWatch = Stopwatch.StartNew();
Array.ForEach(list, x => total += x);
stopWatch.Stop();
return stopWatch.ElapsedTicks;
}
}
在我的机器上(可能运行与其他CLR不同的CLR)它(在发布中)生成:
ForEach 695910
foreach 123852
在调试中:
ForEach 941030
foreach 845443
foreach
喜欢一些编译器优化,我想主要是访问内存中的列表。我建议有更多时间的人看看Reflector ......