Schnellere Alternativen zu .Distinct ()

7

Ich mache ein Videospiel, bei dem Leistung eine entscheidende Rolle spielt.

Ich verwende die Erweiterungsmethode .Distinct (), um einen eindeutigen Wert aus einer Liste zu erhalten. Gibt es einen schnelleren Weg? (Auch wenn es viele Codezeilen mehr gibt)

    
Vittorio Romeo 11.05.2011, 21:43
quelle

3 Antworten

19

.Distinct ist ein O(n) Aufruf.
Sie können nicht schneller als das.

Sie sollten jedoch sicherstellen, dass Ihre GetHashCode (und in geringerem Maße Equals ) so schnell wie möglich ist.

Abhängig von Ihrem Szenario können Sie List<T> durch HashSet<T> ersetzen, wodurch verhindert wird, dass Duplikate an erster Stelle eingefügt werden. (hat noch O(1) Einfügung)

Sie sollten Ihren Code jedoch immer profilieren, bevor Sie zu Schlussfolgerungen übergehen, was schneller sein muss .

    
SLaks 11.05.2011, 21:45
quelle
4

Muss es eine Liste sein?

Wäre es möglich, von List zu HashSet zu wechseln? HashSet verhindert, dass Objekte mehr als einmal in die Liste eingefügt werden, also ist das Distinct bereits erledigt.

    
David Yaw 11.05.2011 21:45
quelle
0
___ answer5971002 ___

Muss es eine Liste sein?

Wäre es möglich, von List zu HashSet zu wechseln? HashSet verhindert, dass Objekte mehr als einmal in die Liste eingefügt werden, also ist das Distinct bereits erledigt.

    
___ antwort43373446 ___

Wenn Sie das distinct an Ort und Stelle tun können, können Sie es sehr schnell und ohne Zuweisungen durchführen, indem Sie zuerst Array.Sort und dann:

verwenden %Vor%

Sie müssen dann die jetzt kleinere Größe des Arrays verfolgen oder Array.resize verwenden (aber das wird ein neues Array zuweisen)

Alternativ, wenn Sie denselben Ansatz mit einem List<T> durchführen, können Sie RemoveRange am Ende aufrufen, um die Größe ohne Zuteilung zu ändern. Dies endet wesentlich schneller.

Andere Poster sind wahrscheinlich korrekt, obwohl Sie dieses Ziel auf andere Weise erreichen können, wie zum Beispiel die Verwendung eines Hashsets oder das Beibehalten paralleler Sammlungen, bei denen immer nur die verschiedenen Elemente enthalten sind. Verrechnung kleiner Kosten beim Einfügen / Entfernen, so dass keine Zeit mehr benötigt wird, um den eindeutigen Satz zu erhalten.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ tag123linq ___ Die Language Integrated Query (LINQ) ist eine Microsoft .NET Framework-Komponente, die native Datenabfragefunktionen zu .NET-Sprachen hinzufügt. Bitte denken Sie bei Bedarf daran, ausführlichere Tags zu verwenden, zum Beispiel [linq-to-sql], [linq-to-entities] / [entity-framework] oder [plinq] ___ qstnhdr ___ Schnellere Alternativen zu .Distinct () ___ answer5970996 ___

%code% ist ein %code% Aufruf.
Sie können nicht schneller als das.

Sie sollten jedoch sicherstellen, dass Ihre %code% (und in geringerem Maße %code% ) so schnell wie möglich ist.

Abhängig von Ihrem Szenario können Sie %code% durch %code% ersetzen, wodurch verhindert wird, dass Duplikate an erster Stelle eingefügt werden. (hat noch %code% Einfügung)

Sie sollten Ihren Code jedoch immer profilieren, bevor Sie zu Schlussfolgerungen übergehen, was schneller sein muss .

    
___ qstntxt ___

Ich mache ein Videospiel, bei dem Leistung eine entscheidende Rolle spielt.

Ich verwende die Erweiterungsmethode .Distinct (), um einen eindeutigen Wert aus einer Liste zu erhalten. Gibt es einen schnelleren Weg? (Auch wenn es viele Codezeilen mehr gibt)

    
___
jackmott 12.04.2017 15:12
quelle

Tags und Links