2010-10-28 2 views
16

J'ai Liste qui a 150K éléments. Le temps moyen de travail IndexOf() est 4 fois inférieur à Contient(). J'ai essayé d'utiliser List of int. Pour la liste des chaînes, IndexOf est un peu plus rapide.Pourquoi la liste <T> .IndexOf() beaucoup plus rapidement que la liste <T> .Contains()?

Je n'ai trouvé qu'une seule différence principale, c'est l'attribut TargetedPatchingOptOut. MSDN dit:

Indique que la méthode de bibliothèque de classes .NET Framework auquel cet attribut est appliqué est peu susceptible d'être affecté par entretien de presse, et est donc éligible à inline à travers les images de Native Image Generator (NGen).

Cet attribut peut-il être la cause d'un tel comportement? Et pourquoi la méthode Contient() n'a-t-elle pas un tel attribut?

Merci d'avance.

EDIT:

J'ai le code quelque chose comme ceci:

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:

J'ai écrit même code comme dans IndexOf() et il fonctionne plus lentement que Contient().

+1

Qu'est-ce que les données contenues dans ce cas? –

+0

Et non - Je ne pense pas que l'attribut ait quelque chose à voir avec ça. –

+0

J'utilise int et string, le comportement est le même. –

Répondre

4

Ils arrivent chacun à la méthode pour déterminer l'égalité légèrement différemment, selon leurs entrées MSDN. Regardez sous les « remarques » de chacune de ces entrées:

List<T>.IndexOf utilise EqualityComparer<T>.Default http://msdn.microsoft.com/en-us/library/e4w08k17.aspx

List<T>.Contains utilise IEquatable<T>.Equals http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

Même s'ils finissent par appeler la même méthode pour déterminer l'égalité dans la fin (comme c'est certainement le cas ici), ils empruntent des voies différentes pour s'y rendre, ce qui les «divise probablement».

Étant donné que la « différence 4x » ne semble pas être le cas concret, la boxe hors mains pourrait expliquer une certaine différence, en particulier avec un ensemble 150k taille des données

+0

Intéressant. Quel est le raisonnement derrière cette différence? – Thilo

+0

Je ne sais vraiment pas désinvolte; en fait, il semblait tellement improbable qu'ils soient différents, je n'ai presque pas vérifié pour voir quelles méthodes ils ont utilisées pour tester l'égalité. –

+0

N'espérez-vous pas que 'IEquatable' soit plus rapide? Aussi, une différence de x4 semble beaucoup. – Kobi

Questions connexes