Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

A quoi sert List<T>.ForEach ?

Vous êtes vous déjà demandé à quoi servait la méthode ForEach de List<T> ? Personnellement, je me pose cette question depuis assez longtemps : pourquoi l'utiliser alors que la construction foreach du langage fait la même chose, sans appel de delegate.

Nous avons 3 possibilités pour itérer sur une liste :

List<EventArgs> list;
foreach (EventArgs item in
list)
{
    item.ToString();
}

et

for (int j = 0; j < list.Count; j++)
{
    list[j].ToString();
}

sont celles que l'on a l'occasion d'utiliser couramment (surtout la première). Il est assez connu que la première version est beaucoup plus lente que la deuxième (près de 2 fois plus lente). Ceci est du en partie au fait que lors de la compilation d'une construction foreach, le compilateur ajoute un try/catch.

Il y a également une troisième possibilité :

list.ForEach(
    delegate(EventArgs item)
    {
        item.ToString();
    });

Il se trouve que cette version est un tout petit peu plus lente que la seconde, mais toujours beaucoup plus rapide que la première, même si celle si utilise un appel de delegate (qui s'avère toujours beaucoup plus lent qu'un appel de méthode classique, non virtuelle).

Je m'appuie sur le bench effectué par Jon Skeet sur son blog : http://msmvps.com/blogs/jon.skeet/archive/2006/01/20/foreachperf.aspx.

Moralité, si vous utilisez List<T>, préférez List<T>.ForEach à la construction foreach du langage.

Cela dit, avec C# 3.0 et surtout LINQ, nous fonçons vers un usage encore plus intensif des foreach et des appels de délégués, mais écrire un bout de code en 1 ligne au lieu de 20 grâce à LINQ vaut surement cette baisse de performance (c'est non seulement plus rapide à écrire, mais surtout plus rapide à relire).

Publié lundi 22 octobre 2007 11:48 par RaptorXP
Classé sous : , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: A quoi sert List<T>.ForEach ?

Merci !

Je ne savais pas que foreach ajoutais un try/catch donc j'ai quand même vérifié, et ca dépend avec quoi on l'utilise

foreach (Char c in "Hello")

{

   Console.WriteLine(c);

}

==&gt; Utilisation d'un index de la propriété String.Length, Get_Chars(i)

   pas de try

foreach (Char c in "Hello".ToCharArray())

{

   Console.WriteLine(c);

}

==&gt; utilisation de ldlelem et ldlen pour connaitre la taille d'un tableau et l'élément à l'index i

   pas de try

foreach (Char c in new List

<Char>("Hello".ToCharArray())){

   Console.WriteLine(c);

}

==&gt; Utilisation de GetEnumerator

   ajout d'un try

Le try est donc utilisé lorsque le compilo choisi d'utiliser la méthode GetEnumerator (dans la majorité des cas)

On peut aussi utiliser

IEnumerator<Char> en = l.GetEnumerator();

while (en.MoveNext())

{

   Response.Write(en.Current);

}

ou alors

for (IEnumerator<Char> en = l.GetEnumerator(); en.MoveNext(); )

{

   Response.Write(en.Current);

}

lundi 22 octobre 2007 14:35 by cyril

# Et en VB

En VB 2005 on trouve grosso modo les même résultats :

- "For i" est ~30% plus rapide que "For Each"

- "List.ForEach" est ~20% plus rapide que "For Each"

Par contre, vu qu'on n'a pas eu le droit aux méthodes anonymes, l'emploi de List.ForEach nous oblige à définir une méthode à part pour le corps de la boucle et nous empêche d'utiliser d'autres variables locales que item...

A noter aussi que contrairement au C#, il n'y a pas d'optimisation à utiliser une variable plutôt qu'une propriété comme limite du for :

   "For i as Integer = 0 to list.Count"

prend le même temps que

   "Dim c as Integer = list.Count

    For i as Integer = 0 to c"

lundi 22 octobre 2007 14:41 by Jem

# re: A quoi sert List<T>.ForEach ?

Cyril&gt; oui, pour les tableaux, .NET 2.0 a connu une optimisation pour les foreach et les performances sont quasiment équivalentes avec un foreach qu'avec une boucle for(int i; i &lt; array.Length; i++)

lundi 22 octobre 2007 15:10 by RaptorXP

# re: A quoi sert List<T>.ForEach ?

Interessant pour le try/catch je ne savais pas

lundi 22 octobre 2007 16:28 by NeuroCypher

# re: A quoi sert List<T>.ForEach ?

Attention, il faut également prendre en compte l'accès aux variables externes de la méthode anonyme qui consomme un peu car passe par une recopie de ces valeurs dans la classe hôte de la méthode anonyme.

A cause de ce mécanisme, quelques effets de bords font que List

<T>.ForEach ne donne pas toujours les mêmes résultats qu'un for ou foreach normal...

jeudi 25 octobre 2007 07:45 by Mitsu
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Kinect + Speech Recognition + Eedomus = Dommy par Aurélien GALTIER le il y a 43 minutes

- [ SharePoint Summit 2014 ] Une méthodologie simple pour concevoir vos applications OOTB SharePoint de A à Z par Le blog de Patrick [MVP SharePoint] le il y a 1 heure et 9 minutes

- //Lean/ - Apprendre à faire des Apps Windows universelles par Blog de Jérémy Jeanson le il y a 5 heures et 3 minutes

- Une culture de la donnée pour tous… par Le blog de Patrick [MVP SharePoint] le il y a 7 heures et 0 minutes

- [ SharePoint Summit 2014 ] L’utilisation de SharePoint 2013 pour la mise en place d’un site Internet Grand Public par Le blog de Patrick [MVP SharePoint] le il y a 21 heures et 8 minutes

- [ SharePoint Summit Montréal 2014 ] Mes présentations sont en ligne par Le blog de Patrick [MVP SharePoint] le il y a 23 heures et 44 minutes

- [ SharePoint Summit Montréal 2014 ] L'intelligence d'affaire dans O365 : enfin facile et économique grâce aux dernières évolution de la Power BI par Le blog de Patrick [MVP SharePoint] le 04-15-2014, 17:07

- [ SharePoint Summit Montréal 2014 ] Kit de démarrage rapide pour de la collaboration en mode Intranet avec SharePoint par Le blog de Patrick [MVP SharePoint] le 04-14-2014, 18:40

- [ SharePoint Summit Montréal 2014 ] Une conférence francophone majeure autour de SharePoint par Le blog de Patrick [MVP SharePoint] le 04-14-2014, 15:52

- [status.modern.ie] Tout savoir sur les futures versions d'Internet Explorer par Philippe Didiergeorges Aka Philess le 04-08-2014, 11:07