2013-06-18 4 views
1

Y a-t-il une différence de performance entre ces deux énumérations d'un Hashset<string> en C#?Vitesse d'énumération de Hashset

foreach(string value1 in Hashset1) { 

} 

et

for(int i = 0; i < Hashset1.Count; i++) { 
    string _value1 = Hashset1.ElementAt(i); 
} 

est-il une autre énumération rapide (sage performance) d'un Hashset?

+0

Dans la mesure du possible, évitez d'énumérer les ensembles de hachage et les dictionnaires. –

+1

Pourquoi ne pas l'essayer vous-même? Faites quelques repères et tirer vos conclusions, ce n'est pas difficile à faire. –

+0

Voici un lien qui explique comment répondre à ce genre de questions: http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx –

Répondre

7

Si cela vous intéresse, vous devriez faire un benchmark et voir par vous-même quelle est la solution la plus rapide dans votre scénario.

Dans ce cas, la deuxième solution est généralement plus lente car ElementAt est une méthode d'extension Enumerable. Il a un chemin optimisé pour IList < T>, que HashSet < T> n'implémente pas. Donc, il prend le chemin "normal" qui énumère N éléments de votre IEnumerable < T>.

Vous pouvez comprendre par vous-même que votre deuxième solution a une complexité O (N^2), tandis que la première est sûrement O (N).

Existe-t-il une autre énumération rapide de HashSet? Non je ne pense pas. C'est ce que IEnumerable est pour. Mais n'est-ce pas assez rapide pour vous? Le micro-benchmarking est inutile et je m'inquiéterais si votre performance était liée à cela.

3

Oui, il y a une énorme différence entre les deux.

Enumerable.ElementAt(int) est une opération O (n), donc votre seconde est de complexité O (n^2). Par contre, l'énumération de l'ensemble à travers l'énumérateur est une opération O (n).