Topic de Margot_Lafeet :

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 https://image.noelshack.com/fichiers/2018/26/7/1530476579-reupjesus.png )

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. https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Je demande donc de l'aide aux EXPERTS C# s'ils y en a ici https://image.noelshack.com/fichiers/2018/29/6/1532128784-risitas33.png

pas lu + la balise code existe :ok:
Il faut que tu cast la liste en pot de miel

Le 17 octobre 2021 à 10:08:47 :
pas lu + la balise code existe :ok:

Merci du up mon bon khey
Edit : la balise ne fonctionne pas pour le mien https://image.noelshack.com/fichiers/2017/20/1494968374-pas-de-chance.png

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 ?

Le 17 octobre 2021 à 10:10:28 Margot_Lafeet a écrit :

Le 17 octobre 2021 à 10:08:47 :
pas lu + la balise code existe :ok:

Merci du up mon bon khey
Edit : la balise ne fonctionne pas pour le mien https://image.noelshack.com/fichiers/2017/20/1494968374-pas-de-chance.png

Ah oui, c'est sans doute la faute de la balise :)

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 ?
J'allais t'aider mais fais un effort de présentation c'est inbitable ton code

:rire:

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

C'est juste parce que le Contains s'arrête dès qu'il a trouvé ce qu'il cherche. Du coup quand tu l'applique à la petite liste ça cha ge pas grand chose mais quand tu l'applique à à la grande liste ça te fait un gros gain

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'op

En 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

Très chiant à lire ce topic, j'espère que t'es pas chargé d'écrire des rapports au taff

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
En ligne sur JvArchive 228