Array.Contains läuft sehr langsam, jeder wirft etwas Licht?

8

Ich habe einige Benchmarks in Bezug auf List.Contains, Array.Contains, IEnumerable.Contains, ICollection.Contains und IList.Contains gemacht.

Die Ergebnisse sind:

%Vor%

Wie ich herausgefunden habe, wäre es sehr langsam, wenn Array.Contains direkt aufgerufen wird (was IEnumerable entspricht)

Ich finde auch, dass es seltsam ist, dass die MSDN-Array-Seite nicht die Methode contains im Abschnitt extension method aufgeführt hat.

Beispielcode:

%Vor%     
colinfang 18.09.2011, 00:43
quelle

3 Antworten

3

Die Art und Weise, wie Sie diese Zeiten festlegen, ist nicht ausreichend. Sie benötigen wesentlich größere Eingänge, um die für die Algorithmen repräsentativen Zeiten zu erhalten. Ja Contains() ist langsamer als eine einfache lineare Suche (etwas, das Sie weggelassen haben), aber die verschiedenen Aufrufe werden nicht die Zeiten haben, die Sie gezeigt haben. Sie werden wahrscheinlich keine Unterschiede zwischen den Aufrufen von Contains() sehen, wenn Sie auf die verschiedenen Typen umgeleitet werden, da wir wahrscheinlich für alle die gleiche Implementierung aufrufen.

Versuchen Sie diesen Code für die Größe:

%Vor%

Spezifikationen:
Windows 7 Professional 64-Bit-Version Intel Core 2 Quad Q9550 @ 2.83GHz
4x1GiB Corsair Dominator DDR2 1066 (PC2-8500)

Standard-.NET 4.0-Konsolen-App-Version Build-Targeting x64:

%Vor%     
Jeff Mercado 18.09.2011 04:02
quelle
0

Vermutung: IList / List verwendet ICollection.Contains, das direkt Elemente in der Sammlung durchsucht.

Array- und IEnumerable-Versionen verwenden IEnumerable.Contains, die die Erstellung eines Enumrators erfordern und generischen Iterationscode (wie MoveNext-Aufrufe) ausführen.

    
Alexei Levenkov 18.09.2011 01:08
quelle
0

Stellen Sie sicher, dass Sie die Ergebnisse der Contains-Methode irgendwie in Ihrem Code verwenden, damit diese nicht optimiert wird. Ich rate in einer Situation kann es eine Hashtable verwenden, und in den anderen muss es lineare Suche zu tun. Entweder das oder es läuft einfach nicht, da es nichts macht.

Wie auch immer, wer wird jemals Code schreiben, der umwandelt und dann millionenfach läuft ...

    
BobTUrbo 18.09.2011 02:18
quelle

Tags und Links