Des experts en C# ici ?
SuppriméSalut les clés,
Ce matin je me suis posé une question concernant les énumérations en C# (oui un dimanche matin )
Je me disais que pour tester une liste avec plusieurs éléments il valait mieux l'énumérer une fois et faire le test pour chaque élément plutôt qu'énumérer la liste pour chaque élément.
J'ai fais mes tests et il s'avère que c'est l'inverse et je suis STUPEFAIT. Je ne comprends pas comment énumérer plusieurs fois une liste de 500 000 éléments est plus rapide que l'énumérer qu'une fois.
Voici le code :
Random rnd = new Random();
List<string> maGrandeListe = new List<string>();
for (int i = 1; i <= 5000000; i++)
{
int rand = rnd.Next();
maGrandeListe.Add(rand.ToString());
}
maGrandeListe.Insert(150000, "oqhzfioemjzqfieom");
maGrandeListe.Add("4534fe53z");
var maPetiteListe = new List<string>
{
"4534fe53z", "gezqfuilezhfuizl", "oqhzfioemjzqfieom", "jojfiqzomfjiezomq", "gjzqfjeizoqmfjeiozq", "4534fegre53z", "gezqfuilezhfuizl", "oqhzfgreioemjzqfieom", "jojfiqzomfjiezomq", "gjzqfjeizoqmfjeiozq", "4534grefe53z", "gezqfuilezhfuizl", "oqhzfioemggrerejzqfieom", "jojfiqzomfjiezomq", "gjzqfjeizoqmfjeiozq","4534grefe53z", "gezqfuigrelezhfuizl"
};
var watch = new System.Diagnostics.Stopwatch();
int ie = 0;
watch.Start();
foreach (var mot in maGrandeListe)
{
if (maPetiteListe.Contains(mot)) ie++;
//Console.WriteLine(ok cool");
}
Console.WriteLine("Premier : " + watch.ElapsedMilliseconds);
watch.Restart();
foreach (var mot in maPetiteListe)
{
if (maGrandeListe.Contains(mot)) ie++;
//Console.WriteLine("cool ++");
}
Console.WriteLine("Deuxième : " + watch.ElapsedMilliseconds);
J'ai beau changer la taille de la petite liste le résultat est toujours le même.
code
existe Le 17 octobre 2021 à 10:09:52 :
Il faut que tu cast la liste en pot de miel
En pot de miel ? C'est à dire ?
j'ai relu 5 fois, ça n'a aucun sens
Et il n'y a même pas les résultats
Le 17 octobre 2021 à 10:16:43 :
J'allais t'aider mais fais un effort de présentation c'est inbitable ton code
Si t'es pas capable de comprendre ça tu seras probablement pas capable de l'aider non plus
Le 17 octobre 2021 à 10:15:35 TetonVenere a écrit :
Alors j'était pas sûr de comprendre mais après lecture ça me semble évident, soit tu parcours 17 fois 5 millions, soit tu parcours 5 millions de fois 17 qu'est ce qui te choques au juste ?
Ce qui me choque c'est que parcourir 17 fois 5 millions est plus rapide que parcourir UNE fois 5 millions
Le 17 octobre 2021 à 10:16:43 Zemmour2047 a écrit :
J'allais t'aider mais fais un effort de présentation c'est inbitable ton code
Désolé la balise code ne fonctionne pas à cause des chevrons dans le code
Le 17 octobre 2021 à 10:18:11 :
Le 17 octobre 2021 à 10:15:35 TetonVenere a écrit :
Alors j'était pas sûr de comprendre mais après lecture ça me semble évident, soit tu parcours 17 fois 5 millions, soit tu parcours 5 millions de fois 17 qu'est ce qui te choques au juste ?Ce qui me choque c'est que parcourir 17 fois 5 millions est plus rapide que parcourir UNE fois 5 millions
Le Contains fait aussi un parcours complet pour les listes.
Donc il n'y a jamais un seul parcours dans les 2 cas
Je crois avoir compris ce que veux dire l'op
En gros il est étonné que le Contains est plus rapide que le foreach
Le 17 octobre 2021 à 10:18:11 :
Le 17 octobre 2021 à 10:15:35 TetonVenere a écrit :
Alors j'était pas sûr de comprendre mais après lecture ça me semble évident, soit tu parcours 17 fois 5 millions, soit tu parcours 5 millions de fois 17 qu'est ce qui te choques au juste ?Ce qui me choque c'est que parcourir 17 fois 5 millions est plus rapide que parcourir UNE fois 5 millions
Alors je suis pas sûr de comprendre, mais dans ton exemple, dans le premier cas tu comprendre la grande avec la petite donc tu fait 5M x 17 et dans le deuxième tu compares la petite avec la grande en faisant donc 17 x 5M
à quel moment tu fait un seul parcours ?
si t'avait écris :
watch.Start();
foreach (var mot in maPetiteListe) if (maGrandeListe.Contains(mot)) ie++;
Console.WriteLine("Premier : " + watch.ElapsedMilliseconds);
watch.Restart();
if (maGrandeListe.Contains("dgdgdfgdfgdfgkdfjg")) ie++;
Console.WriteLine("Deuxième : " + watch.ElapsedMilliseconds);
Et que le deuxième était plus long que le premier, là oui il y aurait problème
Le 17 octobre 2021 à 10:19:40 Jean-OCaml a écrit :
Le 17 octobre 2021 à 10:18:11 :
Le 17 octobre 2021 à 10:15:35 TetonVenere a écrit :
Alors j'était pas sûr de comprendre mais après lecture ça me semble évident, soit tu parcours 17 fois 5 millions, soit tu parcours 5 millions de fois 17 qu'est ce qui te choques au juste ?Ce qui me choque c'est que parcourir 17 fois 5 millions est plus rapide que parcourir UNE fois 5 millions
Le Contains fait aussi un parcours complet pour les listes.
Donc il n'y a jamais un seul parcours dans les 2 cas
En effet, mais je ne comprends toujours pas pourquoi le premier cas prend quasiment le double de temps (624ms contre 356ms)
Le 17 octobre 2021 à 10:21:10 :
Je crois avoir compris ce que veux dire l'opEn gros il est étonné que le Contains est plus rapide que le foreach
Ah oui en effet, son insert est à 150 000 et pareil pour la petite liste, l'élément se trouve en 8 ième position
j'ai la flemme de faire le calcul mais ça doit faire en sorte que le premier prends moins de temps que le second
Données du topic
- Auteur
- Margot_Lafeet
- Date de création
- 17 octobre 2021 à 10:07:32
- Date de suppression
- 24 octobre 2021 à 07:40:55
- Supprimé par
- Auteur
- Nb. messages archivés
- 26
- Nb. messages JVC
- 26