/ / ¿Son las lambda más rápidas que las consultas de linq? - linq, c # -4.0, lambda, procesamiento paralelo, extensiones paralelas

¿Son las lambda más rápidas que las consultas de linq? - linq, c # -4.0, lambda, procesamiento paralelo, extensiones paralelas

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 № 1

Tus 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();

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.