Estoy jugando con lambda, linq y paralelo y llega una pregunta.
¿Es lambda más rápido que las consultas de linq?
O escribe un código de prueba (Tenlo en GitHub) y el método lambda parece más rápido. ¿Es cierto o me falta algo?
Respuestas
8 para la respuesta № 1Tus consultas no son las mismas.
Expresión de consulta:
from p in lista
where p.Age > 18 && p.Age < 60 && p.Phone.StartsWith("11")
select p
Método de extensión regular llamadas:
.Where(n => n.Age > 18).
Where(n => n.Age < 60).
Where(n => n.Phone.StartsWith("11"))
La primera llama Where
una vez; las segundas llamadas Where
tres veces. Para hacerlos comportar exactamente lo mismo Deberías usar:
.Where(n => n.Age > 18 && n.Age < 60 && n.Phone.StartsWith("11"))
En ese momento, las dos formas se compilarán exactamente con el mismo código.
Además, hay una enorme agujero en tus pruebas: estas probando edificio la consulta ... tu nunca eres en realidad evaluando eso:
sw.Start();
IEnumerable listaSemParalelismoLinq = from p in lista
where p.Age > 18 && p.Age < 60 &&
p.Phone.StartsWith("11")
select p;
sw.Stop();
Tú debe utilice la consulta de alguna forma, por ejemplo, vocación Count()
en ella, para hacerla realmente "ejecutar". (Necesitarás cambiar el tipo al genérico IEnumerable
forma, por ejemplo utilizando var
.) El tiempo necesario para construir la consulta es básicamente irrelevante en casi todos los casos.
0 para la respuesta № 2
Yo hago las modificaciones sugeridas por @Jon Skeet, ejecuto el programa en el siguiente orden
Console.WriteLine("1 - LINQ without paralelism " + LinqWithoutParalelism(lista));
Console.WriteLine("2 - LINQ with paralelism " + LinqWithParalelism(lista));
Console.WriteLine("3 - Lambda without paralelism: " + LambdaWithoutParalelism(lista));
Console.WriteLine("4 - Lambda with paralelism: " + LambdaWithParalelism(lista));
Y aparentemente el lamba es más rápido, pero cambio el orden de ejecución para
Console.WriteLine("3 - Lambda without paralelism: " + LambdaWithoutParalelism(lista));
Console.WriteLine("4 - Lambda with paralelism: " + LambdaWithParalelism(lista));
Console.WriteLine("1 - LINQ without paralelism " + LinqWithoutParalelism(lista));
Console.WriteLine("2 - LINQ with paralelism " + LinqWithParalelism(lista));
y la lambda no es la más rápida. Sé que esta prueba es muy simple y no estoy considerando el tiempo de calentamiento y hacer muchas interacciones, pero, REALMENTE mi respuesta es: NO, lambda no se envía más rápido que las consultas de linq.