Почему List .IndexOf () намного быстрее, чем List .Contains ()?

У меня есть List, который содержит 150K элементов. Среднее время работы IndexOf () в 4 раза меньше, чем Contains (). Я пробовал использовать List of int. Для списка строк IndexOf работает немного быстрее.

Я обнаружил только одно основное отличие, это атрибут TargetedPatchingOptOut. MSDN сообщает:

Указывает, что метод библиотеки классов .NET Framework, к которому применяется этот атрибут, вряд ли будет затронут обслуживающими выпусками, и, следовательно, может быть встроен в образы Native Image Generator (NGen).

Может этот атрибут может быть причиной такого поведения? И почему у метода Contains () нет такого атрибута?

Заранее спасибо.

EDIT:

У меня есть примерно такой код:

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:

Я написал тот же код, что и в IndexOf () и работает медленнее, чем Contains ().

16
задан Pavel Belousov 28 October 2010 в 08:43
поделиться