Ich kann eine Liste mit Sortieren oder Bestellen sortieren. Welches ist schneller? Arbeiten beide an demselben Algorithmus?
List<Person> persons = new List<Person>();
persons.Add(new Person("P005", "Janson"));
persons.Add(new Person("P002", "Aravind"));
persons.Add(new Person("P007", "Kazhal"));
1.
persons.Sort((p1,p2)=>string.Compare(p1.Name,p2.Name,true));
2.
var query = persons.OrderBy(n => n.Name, new NameComparer());
class NameComparer : IComparer<string>
{
public int Compare(string x,string y)
{
return string.Compare(x, y, true);
}
}
c#
.net
performance
sorting
sql-order-by
user215675
quelle
quelle
Antworten:
Warum nicht messen:
Auf meinem Computer druckt dieses Programm beim Kompilieren im Release-Modus:
AKTUALISIEREN:
Wie von @Stefan vorgeschlagen, sind hier die Ergebnisse der weniger häufigen Sortierung einer großen Liste:
Drucke:
In diesem Szenario sieht es so aus, als ob OrderBy eine bessere Leistung erbringt.
UPDATE2:
Und mit zufälligen Namen:
Wo:
Ausbeuten:
Trotzdem ist OrderBy schneller
quelle
LINQ
im Vergleich zu einer direktenList<T>.Sort
Implementierung zusätzlicher Speicher benötigt wird . Ich bin nicht sicher, ob sie dies in neueren .NET-Versionen verbessert haben, aber auf meinem Computer (i7 3. Generation 64-Bit .NET 4.5-Version)Sort
übertrifft esOrderBy
in allen Fällen. Wenn man sich denOrderedEnumerable<T>
Quellcode ansieht , scheint es außerdem drei zusätzliche Arrays zu erstellen (zuerst aBuffer<T>
, dann ein Array von projizierten Schlüsseln, dann ein Array von Indizes), bevor schließlich Quicksort aufgerufen wird, um das Array von Indizes an Ort und Stelle zu sortieren.ToArray
Aufruf, der das resultierende Array erstellt. Speicheroperationen und Array-Indizierung sind unglaublich schnelle Operationen, aber ich kann die Logik hinter diesen Ergebnissen immer noch nicht finden.Nein, sie sind nicht der gleiche Algorithmus. Für den Anfang wird der LINQ
OrderBy
als stabil dokumentiert (dh wenn zwei Elemente dasselbe habenName
, werden sie in ihrer ursprünglichen Reihenfolge angezeigt).Es hängt auch davon ab, ob Sie die Abfrage puffern oder mehrmals wiederholen (LINQ-to-Objects wird, sofern Sie das Ergebnis nicht puffern, nachbestellen
foreach
).Für die
OrderBy
Abfrage wäre ich auch versucht zu verwenden:(für
{yourchoice}
einen vonCurrentCulture
,Ordinal
oderInvariantCulture
).List<T>.Sort
Enumerable.OrderBy
quelle
Enumerable.OrderBy
die interne Implementierung zu öffnen und einen Drilldown durchzuführen, können Sie feststellen, dass der OrderBy-Sortieralgorithmus eine Variante von QuickSort ist, die eine stabile Sortierung durchführt. (VglSystem.Linq.EnumerableSorter<TElement>
.) So ,Array.Sort
undEnumerable.OrderBy
kann sowohl zu erwarten haben O (N log N) Ausführungszeiten, wobei N die Anzahl der Elemente in der Sammlung ist.Die Antwort von Darin Dimitrov zeigt, dass dies
OrderBy
etwas schneller ist alsList.Sort
bei bereits sortierten Eingaben. Ich habe seinen Code so geändert, dass er die unsortierten Daten wiederholt sortiert undOrderBy
in den meisten Fällen etwas langsamer ist.Darüber hinaus wird beim
OrderBy
Test dieToArray
Aufzählung des Linq-Enumerators erzwungen, dies gibt jedoch offensichtlich einen Typ (Person[]
) zurück, der sich vom Eingabetyp (List<Person>
) unterscheidet. Ich habe den Test daher mitToList
und nicht wiederholtToArray
und einen noch größeren Unterschied festgestellt :Der Code:
quelle
OrderByWithToList
dauert genauso lange wieOrderBy
.Ich denke, es ist wichtig, einen weiteren Unterschied zwischen
Sort
und festzustellenOrderBy
:Angenommen, es gibt eine
Person.CalculateSalary()
Methode, die viel Zeit in Anspruch nimmt. möglicherweise mehr als nur das Sortieren einer großen Liste.Vergleichen Sie
Option 2 weist möglicherweise eine überlegene Leistung auf, da die
CalculateSalary
Methode nur n- malSort
aufgerufen wird , während die Option je nach Erfolg des SortieralgorithmusCalculateSalary
bis zu 2 n log ( n ) mal aufruft .quelle
n
times auf. Dies ist offensichtlich nicht so bequem wie die Verwendung von OrderBy.In einer Nussschale :
List / Array Sort ():
OrderBy / ThenBy ():
x => x.Id
. B. :) . Alle Schlüssel werden vor dem Sortieren zuerst extrahiert. Dies kann zu einer besseren Leistung führen als die Verwendung von Sort () und eines benutzerdefinierten Vergleichers.Quellen: MDSN , Referenzquelle und Dotnet / Coreclr- Repository (GitHub).
Einige der oben aufgeführten Anweisungen basieren auf der aktuellen .NET Framework-Implementierung (4.7.2). Es könnte sich in Zukunft ändern.
quelle
Sie sollten die Komplexität der Algorithmen berechnen, die von den Methoden OrderBy und Sort verwendet werden. Wie ich mich erinnere, hat QuickSort eine Komplexität von n (log n), wobei n die Länge des Arrays ist.
Ich habe auch nach Orderby's gesucht, aber ich konnte selbst in der MSDN-Bibliothek keine Informationen finden. Wenn Sie nicht dieselben Werte und Sortierungen haben, die sich nur auf eine Eigenschaft beziehen, bevorzuge ich die Sort () -Methode. Wenn nicht, verwenden Sie OrderBy.
quelle
Ich möchte nur hinzufügen, dass orderby viel nützlicher ist.
Warum? Weil ich das kann:
Warum komplizierter Vergleich? Sortieren Sie einfach nach einem Feld. Hier sortiere ich nach TotalBalance.
Sehr leicht.
Ich kann das nicht mit sort machen. Ich wundere mich warum. Machen Sie es gut mit orderBy.
Die Geschwindigkeit ist immer O (n).
quelle