2010-08-09 10 views
7

Estoy iterando sobre un tipo anónimo con aproximadamente 1000 elementos.rendimiento de linq foreach

La pregunta aquí es cómo es posible que mi bucle tarde casi 3 segundos en completarse mientras que lo que ocurre dentro de los bucles tarda menos de 1 ms. Con mil elementos, me imagino que el ciclo debe terminar dentro del segundo, no 3.

¿Hay alguna manera de hacerlo iterar más rápido?

// takes 1ms to complete 
     var x = tt.Where(p => p.Methods.Count() > 0 && p.PerWeek != this.Project.WorkDaysCount && !p.IsManual); 

// takes almost 3 seconds to complete 
        foreach (var item in x) 
        { 
         // do stuff that takes < 1 ms 
        } 

Respuesta

14

Linq utiliza la ejecución retardada. Su consulta de linq no se ejecuta hasta que alguien usa el IEnumerable devuelto. El tiempo de ejecución que está viendo es el resultado de la consulta, no del foreach.

+0

Por supuesto. No me di cuenta. Gracias. – Jeroen

7

Es ejecución diferida. escribe x.ToList(); y te tomará ~ 3 segundos también.

15

Dos sugerencias inmediatas:

  • No utilice p.Methods.Count() > 0 - que necesita para llevar a cabo un recuento completo, a pesar de que sólo se necesita saber si hay elementos. Use p.Methods.Any() en su lugar.
  • No calcule this.Project.WorkDaysCount en cada iteración. No sabemos los detalles de lo que sucede allí, pero puede ser costoso. Precomputa y usa la constante.

Aquí está el código de consulta mejorada:

int workDaysCount = Project.WorkDaysCount; 
var x = tt.Where(p => p.Methods.Any() && 
       p.PerWeek != workDaysCount && 
       !p.IsManual); 

Como otros han dicho, la razón por la propia creación de consultas no toma ningún tiempo significativo es que es no está haciendo ningún trabajo real. Sin embargo, saber eso no lo hace más rápido, por supuesto :)

Más allá de eso, vamos a necesitar saber más sobre el contexto. ¿Es este LINQ to Objects, LINQ to SQL o algo más? ¿Cuál es el tipo de tt?

+0

Esto es parte de un módulo bastante complejo. tt es el resultado de un grupo de y crea una subcolección. Métodos basados ​​en algunos criterios. Es linq a los objetos. Según su información, creo que puedo optimizar aún más. ¡Gracias! – Jeroen

1

Su IEnumerable (x) no se evaluará hasta que lo materialice

Cuestiones relacionadas