Ответ 1
Я немного изменил код 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, чем другие) она производит (в Release):
ForEach 695910
foreach 123852
В отладке:
ForEach 941030
foreach 845443
- Это показывает, что
foreach
пользуется некоторыми оптимизациями компилятора, я предполагаю, что в основном это касается доступа к списку в памяти. - В Debug это выглядит как накладные расходы на запуск лямбда, и передача количества (по значению) отвечает за разницу.
Я предлагаю, чтобы кто-то с большим количеством времени взглянул на Reflector...