2010-10-28 11 views
16

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().

+1

Lo que es los datos en este caso? –

+0

Y no, no creo que el atributo tenga nada que ver con eso. –

+0

Uso int y cadena, el comportamiento es el mismo. –

Respuesta

4

Cada uno de ellos llega al método para determinar la igualdad de forma ligeramente diferente, de acuerdo con sus entradas de MSDN. Mira debajo de las 'observaciones' 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 el mismo método para determinar la igualdad en el final (como es ciertamente el caso aquí), están tomando diferentes rutas para llegar allí, así que probablemente 'splains it.

Teniendo en cuenta que la "diferencia 4x" no parece ser el caso real, algo de boxeo fuera de entregado podría explicar algunas diferencias, sobre todo con un conjunto de tamaño 150k de datos

+0

Interesante. ¿Cuál es el razonamiento detrás de esta diferencia? – Thilo

+0

Realmente no lo sé de improviso; de hecho, parecía tan improbable que fueran diferentes, casi no verifiqué qué métodos usaban para probar la igualdad. –

+0

¿No esperarías que 'IEquatable' fuera más rápido? También una diferencia de x4 parece bastante. – Kobi

Cuestiones relacionadas