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% 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%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.
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 ...