.net - ¿Por qué es List<T>.IndexOf() mucho más rápido que List<T>.Contains()?
(1)
Cada uno llega al método para determinar la igualdad de manera ligeramente diferente, de acuerdo con sus entradas de MSDN. Mire debajo de los ''comentarios'' de cada una de estas entradas:
List<T>.IndexOf
utiliza EqualityComparer<T>.Default
http://msdn.microsoft.com/en-us/library/e4w08k17.aspx
List<T>.Contains
utiliza IEquatable<T>.Equals
http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx
Incluso si terminan llamando al mismo método para determinar la igualdad al final (como es ciertamente el caso aquí), están tomando diferentes rutas para llegar allí, por lo que probablemente "lo diga".
Dado que la "diferencia 4x" no parece ser el caso real, algún boxeo no autorizado podría explicar alguna diferencia, particularmente con un conjunto de datos de 150k
Tengo Lista que tiene 150K elementos. El tiempo promedio de trabajo IndexOf () es 4 veces menor que Contains (). Intenté usar la lista de int. Para la lista de cadenas, IndexOf es un poco más rápido.
Solo encontré una diferencia principal, es el atributo TargetedPatchingOptOut. MSDN dice:
Indica que es poco probable que el método de biblioteca de clases de .NET Framework al que se aplica este atributo se vea afectado por las versiones de servicio y, por lo tanto, es elegible para ser insertado en las imágenes del generador de imágenes nativas (NGen).
¿Podría este atributo ser una razón de tal comportamiento? ¿Y por qué el método Contains () no tiene tal atributo?
Gracias por adelantado.
EDITAR:
Tengo un código algo como esto:
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:
He escrito el mismo código que en IndexOf () y funciona más lento que Contains ().