Подтвердить что ты не робот

Почему List <T>.IndexOf() намного быстрее, чем List <T>.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;

ИЗМЕНИТЬ 2:

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

4b9b3361

Ответ 1

Каждый из них приходит к методу для определения равенства несколько иначе, в соответствии с их записями MSDN. Посмотрите на "примечания" каждой из этих записей:

List<T>.IndexOf использует EqualityComparer<T>.Default http://msdn.microsoft.com/en-us/library/e4w08k17.aspx

List<T>.Contains использует IEquatable<T>.Equals http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

Даже если они в конечном итоге называют один и тот же метод для определения равенства в самом конце (как это, безусловно, имеет место здесь), они идут по разным маршрутам, чтобы добраться туда, поэтому, вероятно, он "запустил".

Учитывая, что "разница в 4 раза", похоже, не является фактическим случаем, некоторые офф-бокс может объяснить некоторые различия, особенно с набором данных размером 150 тыс.