OVH Cloud OVH Cloud

Question de performances ..

11 réponses
Avatar
AlexC
L'utilisation d'un for each est - il plus rapide que l'utilisation d'une for
i ?
deplus pour une recherche dans un tableau d'une string vaut-il mieux
utiliser
un tableau de string et parcourir celui ci avec un for i pour trouver la
chaine ou utilier
une hastable et utiliser sa méthode GetValue ?

merci d'avance,

AlexC

10 réponses

1 2
Avatar
Patrick Philippot
AlexC wrote:
L'utilisation d'un for each est - il plus rapide que l'utilisation
d'une for i ?
deplus pour une recherche dans un tableau d'une string vaut-il mieux
utiliser
un tableau de string et parcourir celui ci avec un for i pour trouver
la chaine ou utilier
une hastable et utiliser sa méthode GetValue ?



Bonjour,

En ce qui concerne les collections standard, l'utilisation de for each
est de loin préférable à une boucle. En effet, les collections standard
VB sont implémentées comme des listes doublement chaînées, ce qui
signifie qu'à chaque passe d'une boucle For, vous repasseriez par la
case départ, alors que la boucle for each maintient une position
courante.

Pour les autres collections, tout dépend de l'implémentation de
l'interface IEnumerable mais on peut supposer qu'elle est en général
optimisée pour for each. Donc en général, oubliez les boucles For en ce
qui concerne l'énumération des collections qu'elles qu'elles soient.

Si une collection de String doit permettre de retrouver rapidement un
élément, alors oui une hashtable est préférable. Elle consomme plus de
ressources mais le temps d'accès est constant.

Re: GetValue. Je ne vois pas de méthode GetValue dans une Hashtable. On
utilise la méthode Item pour récupérer un élément.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
AlexC
Merci, cela confirme mes soupçons ;)
Désolé pour la méthode Getdata, j'ai confondu pendant l'écriture du mail
avec uen de mes classes.. et je pesait à ce moment là à ContainsValue
Encore merci !

"Patrick Philippot" a écrit dans le
message de news:
AlexC wrote:
L'utilisation d'un for each est - il plus rapide que l'utilisation
d'une for i ?
deplus pour une recherche dans un tableau d'une string vaut-il mieux
utiliser
un tableau de string et parcourir celui ci avec un for i pour trouver
la chaine ou utilier
une hastable et utiliser sa méthode GetValue ?



Bonjour,

En ce qui concerne les collections standard, l'utilisation de for each est
de loin préférable à une boucle. En effet, les collections standard VB
sont implémentées comme des listes doublement chaînées, ce qui signifie
qu'à chaque passe d'une boucle For, vous repasseriez par la case départ,
alors que la boucle for each maintient une position courante.

Pour les autres collections, tout dépend de l'implémentation de
l'interface IEnumerable mais on peut supposer qu'elle est en général
optimisée pour for each. Donc en général, oubliez les boucles For en ce
qui concerne l'énumération des collections qu'elles qu'elles soient.

Si une collection de String doit permettre de retrouver rapidement un
élément, alors oui une hashtable est préférable. Elle consomme plus de
ressources mais le temps d'accès est constant.

Re: GetValue. Je ne vois pas de méthode GetValue dans une Hashtable. On
utilise la méthode Item pour récupérer un élément.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
Vko
Petit supplément d'information sur l'optimisation des boucles For.

Dans un soucis d'optimisation, on pourrait se dire que cas de figure :
__________________________________________
Dim myArray as new ArrayList
...
Dim count as int = myArray.Count
For i as int = 0 to count
..
End For
__________________________________________

est plus rapide que celui-ci
__________________________________________
For i as int = 0 to myArray.Count
...
End For
__________________________________________

Sauf que non. En effet le compilateur va détecter ce schéma et va mettre la
valeur de la propriété "myArray.Count" dans un registre du processeur,
faisant en sorte que l'accès a cette variable est plus rapide que de stocker
la valeur dans une variable locale.

Dans la plus part des cas de figure il faut éviter d'optimiser le code car
le compilateur est prévu pour ca.

"Patrick Philippot" wrote:

AlexC wrote:
> L'utilisation d'un for each est - il plus rapide que l'utilisation
> d'une for i ?
> deplus pour une recherche dans un tableau d'une string vaut-il mieux
> utiliser
> un tableau de string et parcourir celui ci avec un for i pour trouver
> la chaine ou utilier
> une hastable et utiliser sa méthode GetValue ?

Bonjour,

En ce qui concerne les collections standard, l'utilisation de for each
est de loin préférable à une boucle. En effet, les collections standard
VB sont implémentées comme des listes doublement chaînées, ce qui
signifie qu'à chaque passe d'une boucle For, vous repasseriez par la
case départ, alors que la boucle for each maintient une position
courante.

Pour les autres collections, tout dépend de l'implémentation de
l'interface IEnumerable mais on peut supposer qu'elle est en général
optimisée pour for each. Donc en général, oubliez les boucles For en ce
qui concerne l'énumération des collections qu'elles qu'elles soient.

Si une collection de String doit permettre de retrouver rapidement un
élément, alors oui une hashtable est préférable. Elle consomme plus de
ressources mais le temps d'accès est constant.

Re: GetValue. Je ne vois pas de méthode GetValue dans une Hashtable. On
utilise la méthode Item pour récupérer un élément.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr





Avatar
Zazar
Bonsoir,

En ce qui concerne les collections standard, l'utilisation de for each
est de loin préférable à une boucle.



Pour ce qui est de la clarté du code ou de sa réutilisabilité : oui.
Pour les performances, un for est légèrement plus rapide qu'un foreach.

En effet, les collections
standard VB sont implémentées comme des listes doublement chaînées,



Non, dans le cas des collections "simples" telles que ArrayList, c'est un
bête tableau, dans les autres cas, ce sont plusieurs tableaux/collections
mais à ma connaissance aucun double chainage n'intervient dans les
collections fournies en standard.


ce qui signifie qu'à chaque passe d'une boucle For, vous repasseriez
par la case départ,



Non, c'est simplement le cout d'un accés au tableau.

alors que la boucle for each maintient une
position courante.



Exact.

<snip conclusion>

--
Zazar
Avatar
Patrick Philippot
Zazar wrote:
En effet, les collections
standard VB sont implémentées comme des listes doublement chaînées,



Non, dans le cas des collections "simples" telles que ArrayList,
c'est un bête tableau, dans les autres cas, ce sont plusieurs
tableaux/collections mais à ma connaissance aucun double chainage
n'intervient dans les collections fournies en standard.



Désolé mais j'insiste.

Il y a d'une part les collections qui font partie du namespace
System.Collections et d'autre part, (je répète) la Collection "standard"
qui vient de VB6 et qui se trouve d'ailleurs dans le namespace
Microsoft.VisualBasic. Voir la doc SVP. C'est justement parce que cet
objet Collection est le même que celui de VB6 qu'il se trouve là.

Je maintiens donc ce que je dis: la Collection standard au sens VB6 du
terme est une liste doublement chaînée et énumérer son contenu via une
boucle For est une aberration.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Notons également que Microsoft.VisualBasic.Collection n'est pas
sérialisable, contrairement aux autres collections de
System.Collections.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
AlexC
Donc la question ne se pose pas pour moi vu que je bannis systématiquement
le namespace system.visulabasic de mes codes.
Donc, aux dires de tous le monde, la hastable est la meilleur solution à
défaut il vaut mieux utiliser une boucle For.

"Patrick Philippot" a écrit dans le
message de news:
Notons également que Microsoft.VisualBasic.Collection n'est pas
sérialisable, contrairement aux autres collections de System.Collections.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
Zazar
Bonjour,

En effet, les collections
standard VB sont implémentées comme des listes doublement chaînées,



Non, dans le cas des collections "simples" telles que ArrayList,
c'est un bête tableau, dans les autres cas, ce sont plusieurs
tableaux/collections mais à ma connaissance aucun double chainage
n'intervient dans les collections fournies en standard.



Désolé mais j'insiste.

Il y a d'une part les collections qui font partie du namespace
System.Collections et d'autre part, (je répète) la Collection "standard"
qui vient de VB6 et qui se trouve d'ailleurs dans le namespace
Microsoft.VisualBasic. Voir la doc SVP. C'est justement parce que cet
objet Collection est le même que celui de VB6 qu'il se trouve là.



Désolé, je n'avais pas compris qu'AlexC et vous parliez des collections VB6.
Je ne les utilise plus depuis trop longtemps pour me rappeler qu'elles
existent encore :).



Je maintiens donc ce que je dis: la Collection standard au sens VB6 du
terme est une liste doublement chaînée et énumérer son contenu via une
boucle For est une aberration.




--

Zazar
Avatar
Patrick Philippot
Zazar wrote:
Désolé, je n'avais pas compris qu'AlexC et vous parliez des
collections VB6. Je ne les utilise plus depuis trop longtemps pour me
rappeler qu'elles existent encore :).



Pas de quoi, je dois également faire amende honorable. On m'a enduit
d'erreur :-) . Je viens de faire un test avec
Microsoft.VisualBasic.Collection sur un jeu de 50000 objets (des
entiers). Que l'on utilise une boucle For ou une boucle For Each, on met
exactement le même temps pour énumérer (72 sec.)

Ce qui signifie que si Microsoft.VisualBasic.Collection est complètement
compatible avec la version VB6, son implémentation est complètement
différente.

Là où je sens que quelques idées reçues vont être bousculées, c'est
quand je fais le même test en VB6. Non seulement dans la version boucle
For de l'énumération, je vais plus vite (55 sec.) mais dans la version
For Each, l'énumération ne prend qu'une fraction de seconde !!!

Gasp! Il va falloir que je cause aux gens du dpt. VB chez MS...

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Patrick Philippot wrote:
Pas de quoi, je dois également faire amende honorable. On m'a enduit
d'erreur :-) . Je viens de faire un test avec
Microsoft.VisualBasic.Collection sur un jeu de 50000 objets (des
entiers). Que l'on utilise une boucle For ou une boucle For Each, on
met exactement le même temps pour énumérer (72 sec.)

Ce qui signifie que si Microsoft.VisualBasic.Collection est
complètement compatible avec la version VB6, son implémentation est
complètement différente.

Là où je sens que quelques idées reçues vont être bousculées, c'est
quand je fais le même test en VB6. Non seulement dans la version
boucle For de l'énumération, je vais plus vite (55 sec.) mais dans la
version For Each, l'énumération ne prend qu'une fraction de seconde
!!!



Pour compléter cette information...

L'examen (désassemblage) de la classe Microsoft.VisualBasic.Collection
montre que:

1. Le code d'énumération est identique que l'on utilise une boucle For
ou une boucle For Each.
2. L'implémentation de cette classe est assez calamiteuse: un mélange de
ArrayList et de HashTable totalement inefficace.

Conclusion: sans surprise, l'utilisation de cette classe est à
proscrire.

Pour info, l'énumération des mêmes 50 000 objets stockés dans une
ArrayList est instantanée.

Donc on utilise les classes de System.Collections et on oublie
Microsoft.VisualBasic.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
1 2