Ich habe eine Klasse wie diese
List<Category>
um 15k Zeile und List <Product>
um 40k Zeile. Ich mache mit LINQ so
Ich möchte wissen, dass es dafür eine bessere Leistung gibt. Daten könnten in anderen Fällen erhöhen oder verringern
Ich denke, es ist albern, Parallelismus zu verwenden, wenn eine einfache Änderung am Algorithmus es tausendfach beschleunigen kann. Unter der Annahme, dass CategoryID
eine anständige Implementierung von GetHashCode()
hat, hat ein Verzeichnis / Nachschlag fast O(1)
Nachschlagezeiten, verglichen mit der O(n)
Zeit beim Durchsuchen einer Liste.
Zwei mögliche Ansätze:
Angenommen Kategorien haben eindeutige IDs, die Sie verwenden können:
%Vor% Dies hat die Laufzeit O(products.Count + categories.Count)
und verwendet O(categories.Count)
Speicher.
Wenn Kategorien nicht mit einer leeren Liste beginnen, müssen Sie sie möglicherweise erstellen.
Dies hat die Laufzeit O(products.Count + categories.Count)
und verwendet O(products.Count)
Speicher.
Da es normalerweise mehr Produkte als Kategorien gibt, erfordert dieser Ansatz mehr Speicher. Auf der anderen Seite könnte die Suche die Einbettung einer Produktliste in das Kategorieobjekt überflüssig machen.
Sie können die parallele Implementierung von LINQ - PLINQ verwenden. Normalerweise erhöht PLINQ die Geschwindigkeit von LINQ, weil es alle verfügbaren Kerne effizienter nutzt.
%Vor% Sie können auch GroupJoin
anstelle von multiple where
verwenden:
Ссылка
Während Parallel Ihnen eine Kernverbesserung von bis zu nb bietet, können Sie mit GroupJoin eine lineare Komplexität erreichen.
Von @CodesInChaos
Wenn die Anzahl der Kategorien und Produkte im selben Maßstab liegt, erhalten Sie eine Beschleunigung von der quadratischen zur linearen Laufzeit
Sie können beim Organisieren der Produktliste, die nach Kategorie gruppiert ist, wie z. B. Dictionary<int, List<Product>>
, Leistung erzielen. Sie müssen dann nur die Produktliste der Kategorie anhand ihres Schlüssels auswählen, anstatt eine LINQ-Abfrage über die gesamte Produktliste auszuführen und neue Unterlisten zu generieren.
Die effektivste Lösung in diesem Fall wäre die Erstellung von CategoryList aus ProductList. Etwas wie das:
%Vor%Wenn CategoryList bereits vorhanden ist, können Sie die Produkte zuerst nach CategoryID gruppieren und dann die gruppierten Produkte mit den Kategorien verknüpfen.
%Vor%Verwenden Sie dann eine Schleife, um das ProductList-Feld der Category-Objekte festzulegen.
%Vor%Tags und Links c# linq performance