Como dijo Jason, su código es equivalente a:
Enumerable.Range(0, 10).Where(n => n % 2 == 0);
Nota lambda se transformará en una llamada de función que se realiza para cada elemento. Esta es probablemente la mayor parte de la sobrecarga. Hice una prueba, lo que indica LINQ es aproximadamente 3 veces más lentas (GMC mono versión 1.2.6.0) en esta tarea exacta
Time for 10000000 for loop reps: 00:00:17.6852560
Time for 10000000 LINQ reps: 00:00:59.0574430
Time for 1000000 for loop reps: 00:00:01.7671640
Time for 1000000 LINQ reps: 00:00:05.8868350
EDIT: Gishu informa que VS2008 y SP1 marco v3.5 da:
Time for 1000000 loop reps: :00.3724585
Time for 1000000 LINQ reps: :00.5119530
LINQ es aproximadamente 1,4 veces más lento allí.
Compara un bucle for y una lista con LINQ (y cualquier estructura que use internamente). De cualquier forma, convierte el resultado en una matriz (necesaria para forzar a LINQ a dejar de ser "flojo"). Ambas versiones repiten:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
public class Evens
{
private static readonly int[] numbers = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private static int MAX_REPS = 1000000;
public static void Main()
{
Stopwatch watch = new Stopwatch();
watch.Start();
for(int reps = 0; reps < MAX_REPS; reps++)
{
List<int> list = new List<int>(); // This could be optimized with a default size, but we'll skip that.
for(int i = 0; i < numbers.Length; i++)
{
int number = numbers[i];
if(number % 2 == 0)
list.Add(number);
}
int[] evensArray = list.ToArray();
}
watch.Stop();
Console.WriteLine("Time for {0} for loop reps: {1}", MAX_REPS, watch.Elapsed);
watch.Reset();
watch.Start();
for(int reps = 0; reps < MAX_REPS; reps++)
{
var evens = from num in numbers where num % 2 == 0 select num;
int[] evensArray = evens.ToArray();
}
watch.Stop();
Console.WriteLine("Time for {0} LINQ reps: {1}", MAX_REPS, watch.Elapsed);
}
}
pruebas de rendimiento anterior en tareas similares (por ejemplo LINQ vs Loop - A performance test) corroborar esto.
¿Estás ejecutando esto en Mono? ¿Estás seguro de que esto es comparable a Microsoft IL? –
Mono usa MSIL, que también se conoce como CIL después de la estandarización. –
Sí, pero eso no significa que los dos compiladores están creando resultados equivalentes. –