linq foreach Leistung

7

Ich wiederhole einen anonymen Typ mit ungefähr 1000 Elementen.

Die Frage hier ist, wie ist es möglich, dass meine Schleife dauert fast 3 Sekunden zu vervollständigen, während was innerhalb der Schleifen dauert weniger als 1 ms. Bei tausend Elementen muss die Schleife innerhalb der zweiten enden, nicht 3.

Gibt es eine Möglichkeit, es schneller zu iterieren?

%Vor%     
Jeroen 09.08.2010, 16:08
quelle

4 Antworten

14

Linq verwendet eine verzögerte Ausführung. Ihre linq-Abfrage wird nicht wirklich ausgeführt, bis jemand IEnumerable zurückgibt. Die Ausführungszeit, die Sie sehen, ist das Ergebnis der Abfrage, nicht die foreach.

    
Billy ONeal 09.08.2010, 16:10
quelle
15

Zwei unmittelbare Vorschläge:

  • Verwenden Sie nicht p.Methods.Count() > 0 - das muss eine vollständige Zählung durchführen, obwohl Sie nur wissen müssen, ob irgendwelche Elemente vorhanden sind. Verwenden Sie stattdessen p.Methods.Any() .
  • Berechnen Sie this.Project.WorkDaysCount nicht bei jeder Iteration. Wir wissen nicht genau, was dort vor sich geht, aber es kann teuer werden. Rechne es voraus und benutze die Konstante.

Hier ist der verbesserte Abfragecode:

%Vor%

Wie andere bereits gesagt haben, ist der Grund dafür, dass die Abfragekonstruktion selbst keine nennenswerte Zeit in Anspruch nimmt, dass sie keine wirkliche Arbeit leistet. Aber das zu wissen, macht es natürlich nicht schneller:)

Darüber hinaus müssen wir mehr über den Kontext wissen. Ist das LINQ zu Objects, LINQ to SQL oder etwas anderes? Was ist der Typ von tt ?

    
Jon Skeet 09.08.2010 16:12
quelle
7

Es ist eine verzögerte Ausführung. schreibe x.ToList(); und es wird ~ 3 Sekunden dauern.

    
µBio 09.08.2010 16:11
quelle
1

Ihr IEnumerable (x) wird erst ausgewertet, wenn Sie es materialisiert haben

    
StuartLC 09.08.2010 16:13
quelle

Tags und Links