Почему List <T>.IndexOf () намного быстрее, чем List <T>.Contains ()? - PullRequest
16 голосов
/ 28 октября 2010

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

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

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

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

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

РЕДАКТИРОВАТЬ:

Iиметь код примерно так:

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 (), и он работает медленнеечем содержит ().

1 Ответ

4 голосов
/ 28 октября 2010

Каждый из них приходит к методу для определения равенства немного по-разному, в соответствии с их записями 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 КБ

...