LINQ vs foreach vs für Leistung Testergebnisse

8

Könnte jemand diese Ergebnisse erklären? Ich weiß, dass es doppelte Fragen gibt, aber ich muss noch eine einzige Frage finden, die zu dem gleichen Ergebnis wie meine Ergebnisse kam: o

%Vor%

    
Francisco Aguilera 04.04.2014, 00:09
quelle

3 Antworten

16

Sie führen niemals die Abfrage LINQ aus, Sie erstellen sie einfach. Sie sollten die Methode ToList oder ToArray verwenden, um eine Iteration zu erzwingen. Wahrscheinlich erhalten Sie kein anderes Ergebnis, weil LINQ auch eine foreach -Schleife verwendet.

Bearbeiten : LINQ benötigt ein wenig mehr Zeit, da Sie alle Elemente durchlaufen. Aber in Ihren beiden anderen Loops brechen Sie die Schleife, sobald Sie eine Übereinstimmung finden. Verwenden Sie FirstOrDefault anstelle von Where und Sie sollten dasselbe (oder ein ähnliches) Ergebnis erhalten.

%Vor%     
Selman Genç 04.04.2014, 00:11
quelle
1

Die linq nimmt keine Zeit, weil die Abfrage niemals tatsächlich ausgewertet wird .

Linq ist faul für die meisten Operationen, es wird nichts tun, bis jemand startet Aufzählung der Ergebnisse.

wenn Sie

hinzugefügt haben %Vor%

Dann bin ich ziemlich sicher, dass Sie ein Ergebnis ungleich Null für linq haben.

    
John Gardner 04.04.2014 00:12
quelle
0

Es ist offensichtlich von Bedeutung, dass Sum eine Box-Instanz des List-Enumerators auf dem Heap speichern muss und dieses Heap-Objekt zum Iterieren der Liste verwendet. Die Inline-Foreach- und die For-Schleife vermeiden dies; Ersteres, weil Lists öffentliche GetEnumerator-Methode einen Werttyp zurückgibt. Wenn Sie einen Verweis auf Personen in einer IEnumerable<Person> -Variable speichern, dauert die foreach-Schleife etwas länger, um zu ihrem Ergebnis zu gelangen.

Außerdem muss linq Objekte für den Wo-Iterator und den Delegaten erstellen, die an es übergeben werden, und es führt mehr Null-Prüfungen durch, so dass es informative Ausnahmen auslösen kann, wenn eines der Argumente null ist. Das könnte für den Rest der zusätzlichen Zeit verantwortlich sein, die für den linq-Code benötigt wird.

    
phoog 15.05.2014 20:03
quelle