16 Stimmen

Warum ist List<T>.IndexOf() viel schneller als List<T>.Contains()?

Ich habe eine Liste mit 150K Elementen. Durchschnittliche Zeit der Arbeit IndexOf() ist 4 mal niedriger als Contains(). Ich habe versucht, List of int zu verwenden. Für List of strings IndexOf ist ein bisschen schneller.

Ich habe nur einen wesentlichen Unterschied gefunden, nämlich das Attribut TargetedPatchingOptOut. MSDN erzählt:

Zeigt an, dass die Methode der .NET Framework-Klassenbibliothek, auf die dieses Attribut angewendet wird, wahrscheinlich nicht von Wartungsversionen betroffen ist und daher in Native Image Generator (NGen)-Bildern eingefügt werden kann.

Könnte dieses Attribut ein Grund für ein solches Verhalten sein? Und warum hat die Methode Contains() kein solches Attribut?

Vielen Dank im Voraus.

EDITです:

Ich habe einen Code wie diesen:

List<int> list = CommonHelper.GetRandomList(size);

long min = long.MaxValue;
long max = 0;
long sum = 0;

foreach (var i in list)
{
    m_stopwatch.Reset();
    m_stopwatch.Start();
    list.Contains(i); // list.IndexOf(i);
    m_stopwatch.Stop();

    long ticks = m_stopwatch.ElapsedTicks;

    if (ticks < min)
        min = ticks;

    if (ticks > max)
        max = ticks;

    sum += ticks;
}

long averageSum = sum / size;

EDIT 2:

Ich habe den gleichen Code wie in IndexOf() geschrieben und es funktioniert langsamer als Contains().

4voto

Andrew Barber Punkte 38387

Laut ihren MSDN-Einträgen kommen sie jeweils zu einer etwas anderen Methode zur Bestimmung der Gleichheit. Schauen Sie unter den "Bemerkungen" jedes dieser Einträge nach:

List<T>.IndexOf verwendet EqualityComparer<T>.Default http://msdn.microsoft.com/en-us/library/e4w08k17.aspx

List<T>.Contains verwendet IEquatable<T>.Equals http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

Selbst wenn sie am Ende dieselbe Methode aufrufen, um die Gleichheit festzustellen (wie es hier sicherlich der Fall ist), nehmen sie unterschiedliche Wege, um dorthin zu gelangen, und das erklärt es wahrscheinlich.

Da der "4-fache Unterschied" anscheinend nicht der tatsächliche Fall ist, könnten einige unbedachte Boxen einen gewissen Unterschied ausmachen, insbesondere bei einem 150k großen Datensatz

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X