Linq wählt die Übereinstimmungsliste aus der anderen Listenleistung aus

8

Ich habe eine Klasse wie diese

%Vor%

List<Category> um 15k Zeile und List <Product> um 40k Zeile. Ich mache mit LINQ so

%Vor%

Ich möchte wissen, dass es dafür eine bessere Leistung gibt. Daten könnten in anderen Fällen erhöhen oder verringern

    
user1392853 17.08.2015, 06:52
quelle

7 Antworten

12

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:

Verwandle Kategorien in ein Wörterbuch

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.

Verwandeln Sie Produkte in eine Suche

%Vor%

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.

    
CodesInChaos 17.08.2015, 09:34
quelle
5

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%     
Artem Kulikov 17.08.2015 07:00
quelle
4

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

    
tafia 17.08.2015 07:52
quelle
3

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.

%Vor%     
Patrick 17.08.2015 07:50
quelle
2

Die effektivste Lösung in diesem Fall wäre die Erstellung von CategoryList aus ProductList. Etwas wie das:

%Vor%     
Vitaliy Kalinin 17.08.2015 07:37
quelle
2

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%     
Michael Spranger 17.08.2015 09:43
quelle
2

Nach dem Testen der Leistung habe ich herausgefunden, dass eine bessere Lösung als die, die ich vorher gepostet habe, folgende ist:

%Vor%

Und dann list = FilterList(list, products);

Für 3,500,000 -Operationen wurde nur 200ms

benötigt     
Fabjan 17.08.2015 07:33
quelle

Tags und Links