Tengo una lista que tiene 150K elementos. Tiempo promedio de trabajo IndexOf() es 4 veces menor que Contiene(). Traté de usar List of int. Para la lista de cadenas, IndexOf es un poco más rápido.¿Por qué es la lista <T> .IndexOf() mucho más rápida que la lista <T> .Contains()?
Encontré solo una diferencia principal, su atributo TargetedPatchingOptOut. MSDN dice:
Indica que el método de biblioteca de clases de .NET Framework al que se aplica este atributo es poco probable que sea afectado por comunicados de servicio y mantenimiento, y por lo tanto es elegible para ser inline a través de imágenes Generador de imágenes nativas (NGEN).
¿Podría este atributo ser una razón de tal comportamiento? ¿Y por qué el método Contiene() no tiene ese atributo?
Gracias de antemano.
EDIT:
tengo código de 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 misma código como en IndexOf() y funciona más lento que Contains().
Lo que es los datos en este caso? –
Y no, no creo que el atributo tenga nada que ver con eso. –
Uso int y cadena, el comportamiento es el mismo. –