CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Optimisation C++ : FOR ou WHILE ?

Blawk
Blawk
Niveau 10
10 août 2003 à 12:00:58

Salut,

Selon vous, quelle est la forme la plus optimisée ?

short i = nb;
while ( i--){
// blabla
}

/******************************/

for ( short i = 0; i < nb; i++)

/******************************/

for ( short i = ( nb-1); i > = 0; i--)

Blawk
Blawk
Niveau 10
10 août 2003 à 12:05:11

Je me disais que avec FOR, le compilateur aurait la bonne idée de stocké " i" dans un des registres du processeur. Vroi ou faux ?

Kouic
Kouic
Niveau 9
10 août 2003 à 12:25:03

Cette question n´a raison d´etre que si tu programme sur un processeur ( tres) lent.
Si c´est le cas, laisse tomber le C++ ( comme le for de ton exemple) et fait le en C.
Pour ta question, le for me semble plus lisible, mais c´est une question de gout.

register int i;
for( i = 0; i<nb; i++) { }

le mot register demande explicitement au compilateur de mettre la variable dans un registre. Mais en general le compilo est assez intelligent pour le faire lui meme sans demande explicite.

Sur quel machine devrait tourné ce code ?

Blawk
Blawk
Niveau 10
10 août 2003 à 12:44:58

Si tu veux tout savoir, je suis entrain d´implenter Rijndael. Et pour ce genre d´application, le but c´est d´être le plus rapide possible.

Parce que des boucle, il n´y en aura pas une, mais des dixaines de millers à la seconde... lol...

arnaud81
arnaud81
Niveau 7
10 août 2003 à 14:15:14

ca depend de ton compilateur...

tu n´a qu´a regardé le code source assembleur généré par ton compilateur ( facile avec Visual C)

ou tu codes carréement en assembleur tes boucles.
comme ca, tu es sur du resultat :p

Blawk
Blawk
Niveau 10
10 août 2003 à 14:20:54

Euh... On va dire que ej en suis pas très assembleur... lol...

J´ai VC++ 6

Kouic
Kouic
Niveau 9
10 août 2003 à 15:35:49

Dans ce cas, si c´est un compilateur recent, il n´y a pas de questions a ce possées, c´est le compilateur qui fera les optimisations. Il me semble bien que le mot clée ´register´ n´est maintenant plus pris en compte.

Pryrates
Pryrates
Niveau 5
10 août 2003 à 17:31:22

for est bcp plus rapide

Kouic
Kouic
Niveau 9
10 août 2003 à 17:52:15

for est bcp plus rapide

C´est neligable je pense.

Blawk
Blawk
Niveau 10
10 août 2003 à 18:06:45

FOR est effectivement plus performant ( un MOV en moins à chaque itération).

8: int a = 0;
00401048 mov dword ptr [ebp-4],0
9:
10: for ( int i = 0; i < 4; i++)
0040104F mov dword ptr [ebp-8],0
00401056 jmp main+31h ( 00401061)
00401058 mov eax,dword ptr [ebp-8]
0040105B add eax,1
0040105E mov dword ptr [ebp-8],eax
00401061 cmp dword ptr [ebp-8],4
00401065 jge main+3Fh ( 0040106f)
11: a = i;
00401067 mov ecx,dword ptr [ebp-8]
0040106A mov dword ptr [ebp-4],ecx
0040106D jmp main+28h ( 00401058)

//--------------------------------------------

8: int a = 0;
00401048 mov dword ptr [ebp-4],0
9: int i = 4;
0040104F mov dword ptr [ebp-8],4
10: while ( i--)
00401056 mov eax,dword ptr [ebp-8]
00401059 mov ecx,dword ptr [ebp-8]
0040105C sub ecx,1
0040105F mov dword ptr [ebp-8],ecx
00401062 test eax,eax
00401064 je main+3Eh ( 0040106e)
11: a = i;
00401066 mov edx,dword ptr [ebp-8]
00401069 mov dword ptr [ebp-4],edx
0040106C jmp main+26h ( 00401056)

Kouic
Kouic
Niveau 9
10 août 2003 à 18:38:30

Merci pour la confirmation, c´est donc effectivement negligable.

Pryrates
Pryrates
Niveau 5
10 août 2003 à 19:02:48

combien de fois ton programme va-t´il passer dans ton for?
un while(1) d´une boucle principale de jeu a fortement interet a etre remplacée par un for(;;)

Kouic
Kouic
Niveau 9
10 août 2003 à 19:15:39

Avant d´affirmer cela, trouve combien coute un MOV supplementaire.
Je te garantis qu´un code lisible sans reflechir vaux bien un MOV en + :)

Pryrates
Pryrates
Niveau 5
10 août 2003 à 19:18:53

bah ecoute je te conseille de faire un test simple, tu fais

int main() { int i; for ( i = 0; i > = 0; i++) ; }

et

int main() { int i; i = 0; while ( i > = 0) i++; }

tu lances et tu chronometres et on en reparle

Altonfrere
Altonfrere
Niveau 10
10 août 2003 à 19:26:32

Ton test ne sert à rien car il est plutôt rare ( et pas très malin) d´utiliser une boucle vide dans un programme !

Tu sais peut être pas mais des optmisations se font lorque une boucle contient d´autres instructions / appels de fonction etc...

Donc un test comme celui là n´a aucun intérêt

( de plus tu oublies d´initialiser ton i dans le for, ce qui peut grandement fausser les résultats de ton test ( si par exemple i démarre à -1 par ex . . mais j´ose espérer qu´il ne s´agit que d´un oubli de ta part)

Altonfrere
Altonfrere
Niveau 10
10 août 2003 à 19:27:05

oops autant pour moi :) j´ai mal lu l´init

Pryrates
Pryrates
Niveau 5
10 août 2003 à 19:32:45

( xxx@solaria 63)time . /boucle_while ; time boucle_for
6.476u 0.004s 0:06.49 99.6% 0+0k 0+0io 0pf+0w
6.471u 0.000s 0:06.48 99.8% 0+0k 0+0io 0pf+0w

( xxx@jcvd 48)time . /boucle_while ; time boucle_for
10.642u 0.000s 0:10.75 98.9% 0+0k 0+0io 0pf+0w
10.576u 0.000s 0:10.66 99.1% 0+0k 0+0io 0pf+0w

( xxx@min 43)time . /boucle_while ; time boucle_for
55.88u 0.00s 0:55.91 99.9%
55.87u 0.00s 0:55.90 99.9%

solaria etant une station alpha, jcvd un i386 et min une sun

Sinon les boucles vides ca existe bel et bien.. comment veux tu traiter tes callbacks autrement?

Altonfrere
Altonfrere
Niveau 10
10 août 2003 à 19:35:47

je n´ai qu´un mot à dire : :lol:

Pryrates
Pryrates
Niveau 5
10 août 2003 à 19:39:10

ouais bon la sun elle a pas aimé je crois :p

Kouic
Kouic
Niveau 9
10 août 2003 à 20:07:44

Ca y est ! J´ai fait le test en incrementant un compteur dans chacunes des boucles for et while.
Resutat, pour 4294967295 incrementation, for prend une seconde ( environ) de plus.
Donc, faut pas te casser la tete la dessus, comme le dit Altonfrere c´est le reste du code qu´il faut optimiser.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment