Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

For...Next / Do...Loop while

13 réponses
Avatar
Titeuf
Quel type est plus rapide pour effectuer un nombre important de boucle
(5000) ?
For...next ou Do...loop while ?

Merci

10 réponses

1 2
Avatar
Zoury
Salut Titeuf! :O)

AMHA, les deux structures sont pratiquement identique à l'exécution.. alors
choisit celle qui te convient le mieux..

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
ng
Salut,

Je ne pense pas qu'il y ait une grosse différence à ce niveau là.

Si tu connais par avance le nombre de tour, je te conseille For, ca t'évite
d'incrémenter toi même la variable et c'est peut être ca qui fait la
différence de rapidité entre les 2.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Titeuf a écrit :

Quel type est plus rapide pour effectuer un nombre important de boucle
(5000) ?
For...next ou Do...loop while ?

Merci


Avatar
Jean-Marc
"Titeuf" a écrit dans le message de
news:c1g674$7ns$
Quel type est plus rapide pour effectuer un nombre important de boucle
(5000) ?
For...next ou Do...loop while ?

Merci



Bonjour,
En général, le temps d'exécution de la boucle est petit devant le temps dans
la boucle. De plus, on n'obtient de différences significatives (mesurables)
que pour de *grand* nombre de boucles (1 million dans mon exemple).

Le programme suivant fait la même choses de 2 façons différentes: une fois
avec while, une fois avec for. Dans les 2 cas, je le force à utiliser la
variable de la boucle à l'intérieur pour forcer réellement le for à utiliser
sa variable.

Si on exécute ce programme depuis l'IDE, on ontient:
WHILE : 411 ms , FOR : 200

Chouette se dit on, je vais faire des for, et tout est dit. Ouais.. Sauf que
si on compile, et qu'on exécute en lançant l'exécutable, on trouve:
WHILE : 10 ms FOR: 10 ms ..... Surprise !!

C'est bien normal: lors de la compilation, le compilateur fait son job: il
compile et il "comprend" qu'on veut dans les 2 cas faire la même chose. Il
génère donc le même code dans les 2 cas, d'ou lles résultats identiques.

Jean-Marc


----------------------------------------------------------------
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()
Dim i As Long
Dim j As Long
Dim a As Integer
Dim b As Integer
Dim t1 As Long
Dim t2 As Long
Dim tt As Long

i = 1
a = 0
b = 1
t1 = GetTickCount()
While i <> 1000000
a = a + b
If a > 1000 Then
a = 0
End If
If i Mod 2 Then
a = 1
End If
i = i + 1
Wend
t2 = GetTickCount()
tt = t2 - t1

a = 0
b = 1
t1 = GetTickCount()
For i = 1 To 1000000
a = a + b
If a > 1000 Then
a = 0
End If
If i Mod 2 Then
a = 1
End If
Next i
t2 = GetTickCount()
MsgBox "while : " & tt & " for : " & (t2 - t1)
End Sub
Avatar
Titeuf
merci à vous...
Avatar
andre.araste
La présence d'un compteur de boucle ralentit la procédure.

En d'autre termes, une boucle folle dont le compteur est de type Byte
tournera plus vite que celle dotée d'un type Long ... mais sa rotation sera
imitée à 256 tours.

La boucle Do ... Loop n'est freinée que par le test de sa condition.
Globalement ça doit revenir au même.
--
Bonne réception.

http://perso.wanadoo.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.

"Titeuf" a écrit dans le message de
news:c1g674$7ns$
Quel type est plus rapide pour effectuer un nombre important de boucle
(5000) ?
For...next ou Do...loop while ?

Merci




Avatar
François Picalausa
Bonjour/soir,

concernant For...Next, et de son bon usage, il y a un article intéressant
ici:
http://www.xbeat.net/vbspeed/c_ForNext.htm

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Titeuf" a écrit dans le message de
news:c1g674$7ns$
Quel type est plus rapide pour effectuer un nombre important de boucle
(5000) ?
For...next ou Do...loop while ?

Merci


Avatar
Zoury
Salut Andre! :O)

La présence d'un compteur de boucle ralentit la procédure.



Je suis d'accord.


En d'autre termes, une boucle folle dont le compteur est de type Byte
tournera plus vite que celle dotée d'un type Long ... mais sa rotation


sera
imitée à 256 tours.



Je ne vois pas en quoi le type de la variable compteur intervient en la
faveur d'un Byte plus que d'un Long.

Je suis d'accord avec le fait qu'une boucle For soit plus lente que le la
structure Do Loop dans la mesure ou celle-ci doit incrémenté un compteur. Là
où je ne suis pas d'accord, est que soit plus rapide si le compteur est de
type Byte. La majorité des systèmes sont encore optimisé pour les formats de
données sur 32 bits, ce sera donc plus rapide si le compteur est de type
Long.


Globalement ça doit revenir au même.



J'suis d'accord. La différence entre les deux structures est tellement
minime qu'il faudrait un bon nombre de tours (quelques millions par exemple)
avant d'avoir une différence notable à AMHA..


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
andre.araste
>Je ne vois pas en quoi le type de la variable compteur intervient en la


faveur d'un Byte plus que d'un Long.



Je crains qu'on se comprenne mal.

Une variable de type Byte est codée sur un seul octet dans l'intervalle de
valeurs de 0 à 255

Pour vous en convaincre, réalisez ce programme :

Dim Compteur As Byte
For Compteur = 0 To 256 Then
Print "Bonjour !"
Next Compteur

Dès que Compteur va prendre la valeur 256 soit au 257ème tour vous allez
constater une belle erreur système ... avec la sortie de programme qui
s'impose.

... mais la boucle va tourner à une vitesse folle car elle n'explore qu'un
seul octet. Avec un type Long elle mettrait 4 fois plus de temps. Avec un
type Double elle mettrait 8 fois plus de temps.

D'accord ?
--
Bonne réception.

http://perso.wanadoo.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:eAhc4d6%
Salut Andre! :O)

> La présence d'un compteur de boucle ralentit la procédure.

Je suis d'accord.


> En d'autre termes, une boucle folle dont le compteur est de type Byte
> tournera plus vite que celle dotée d'un type Long ... mais sa rotation
sera
> imitée à 256 tours.

Je ne vois pas en quoi le type de la variable compteur intervient en la
faveur d'un Byte plus que d'un Long.

Je suis d'accord avec le fait qu'une boucle For soit plus lente que le la
structure Do Loop dans la mesure ou celle-ci doit incrémenté un compteur.



où je ne suis pas d'accord, est que soit plus rapide si le compteur est de
type Byte. La majorité des systèmes sont encore optimisé pour les formats


de
données sur 32 bits, ce sera donc plus rapide si le compteur est de type
Long.


> Globalement ça doit revenir au même.

J'suis d'accord. La différence entre les deux structures est tellement
minime qu'il faudrait un bon nombre de tours (quelques millions par


exemple)
avant d'avoir une différence notable à AMHA..



Avatar
Zoury
Resalut!

Une variable de type Byte est codée sur un seul octet dans l'intervalle de
valeurs de 0 à 255



On ne peut plus d'accord! :O)


... mais la boucle va tourner à une vitesse folle car elle n'explore qu'un
seul octet. Avec un type Long elle mettrait 4 fois plus de temps. Avec un
type Double elle mettrait 8 fois plus de temps.

D'accord ?



Nope!

Dans un système 32bits, comme c'est le cas pour la majorité des logiciels
(et matériels) actuels (NT4, 2000, XP, 95, 98, Me, VB6, etc.), le CPU traite
les données en bloc de 32bits (et les bus aussi).
Si on lui passe une données de type Long qui est stockée sur 32 bits, il
traite la valeur tel quelle sans aucune modification supplémentaire. Si
toutefois on lui passe une variable de Byte qui est stockée sur 8 bits, le
système devra masquer les 24bits qui sont inutilisé par ce format de
variable avant d'envoyé la valeur au CPU, ce qui demande évidemment des
intructions supplémentaires. Le nombres d'instructions effectuées sur les
données afin de les formattés correctement pour le CPU peuvent varier d'un
type à l'autre, mais une chose est sûre, c'est que d'utiliser un type dont
la taille est identique à celle utilisé par le matériel/logiciel du système
demande moins de ressources.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
jmn
mais comme le compilateur utilise systématiquement ?X pour les entiers 8 ou
16 bits, et E?X pour les entiers longs, et que de plus il génère un XOR sur
le registre concerné avant chaque séquence de calcul pour le mettre à zéro,
il n'y a pas de traitement particulier pour les 'petites valeurs' et, in
fine, l'utilisation d'un entier 8, 16 ou 32 bits revient strictement au
même...
1 2