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

Astuces sur la performance C/C++

lag-it
lag-it
Niveau 10
17 juin 2003 à 13:44:45

Il serait intéressant de répértorier les astuces que vous connaissez pour améliorer les performance d´un programme dans un topic. Sa nous permettrai d´améliorer nos jeux ou logiciels et de faire partager nos connaissance.

- Pour créer une boucle infinie, il est préférable d´utiliser for(;;) plutôt que while(1) car dans ce dernier cas, le programme vérifiera tout de même si 1=TRUE.

- Sur certains compilateurs, le code généré pour l´opérateur de pré-incrémentation s´execute légèrement plus rapidement que l´opérateur de post-incrémentation.

- Passez les valeurs à des fonctions par le biais d´appels par référence ou par pointeurs pour gagner en vitesse sur le transfert des éléments de taille importante.

Chris_le_ouf
Chris_le_ouf
Niveau 5
17 juin 2003 à 14:39:39

" - Sur certains compilateurs, le code généré pour l´opérateur de pré-incrémentation s´execute légèrement plus rapidement que l´opérateur de post-incrémentation."

Ouais, ben en tout cas dans Visual C++ 6 le code généré est identique pour les 2, je viens d´essayer. Ya peut-être un cas spécial où c´est vrai, mais je vois pas quoi. Les 2 sont censés générer les mêmes instructions mais pas dans le même ordre. L´ordre influe rarement sur la vitesse d´execution. A moins qu´il y ait des cas ou avec la pré-incrémentation on tombe sur des instructions bien alignées que le cpu peut décoder toutes en même temps, alors qu´en post il tombe sur une instruction qui bloque le décodage. Sur les Athlon je crois que les instructions fpu se décodent une par une alors que les mmx 3 par 3 ou un truc comme ça, mais là on rentre dans un domaine auquel je ne connais pas grand chose.

Altonfrere
Altonfrere
Niveau 10
17 juin 2003 à 15:00:40

" Il serait intéressant de répértorier les astuces que vous connaissez pour améliorer les performance d´un programme dans un topic"

Ca me parait un peu long à écrire dans un topic . . et puis au bout 2 jours le topic sera perdu 2 pages + loin et plus personne ne le lira . .. Mieux vaut chercher soi même sur le net ( on ne cesse de le répéter!).

Enfin bref, allez 2 petits pour la route!

- Utiliser les opérateurs de décalages autant que possible plutôt que des multiplications ou divisions ( entière)...

ex : A = B * 320;
-> : A = ( B<<8) + ( B<<6);

- L´opérateur modulo ( %) est très lent ! Alors si vous avez besoin de vous en servir préférez l´opérateur & :

ex : A = ( B % 64);
-> : A = ( B & 0x3F);
( ceci ne fonctionne que pour les puissances de 2 en partie droite de %)

etc..

t_simons
t_simons
Niveau 10
17 juin 2003 à 15:27:35

Astuce pour que ca aie plus vite:

Passer les parametres aux fonctions par adresse au lieu de passer par valeur, car a chaque appel de la fonction, le prog empile la copie de chaque parametre au sommet du stack(pile), alors que quand on passe par adresse, il n´empile que l´adresse, ce qui est beaucoup moins lourd.

Mais bon, ce conseil est donné dans tout bon cour d´informatique qui se respecte ^_^

zaor
zaor
Niveau 5
17 juin 2003 à 15:29:53

évitez les :

void main ( )
{
for(;;)
int * Test = new int;
}

ça fait tâche =)
moi jdis que c un bon conseil =) . .. =)

t_simons
t_simons
Niveau 10
17 juin 2003 à 15:35:08

c clair que la boucle for(;;), c pas super lisible, c plus clair while(1)

Kouic
Kouic
Niveau 9
17 juin 2003 à 17:15:50

De facon general, un new dans une boucle for ca fait tache. Si possible faire les new avant les boucles, quit a allouer plus de memoire qu´il n´en faut.

Et pour ceux qui copie des char d´une zone a une autre dans une boucle en utilisant le cpu, grouper les 4 par 4.
for(int i = 0; i < NBR_DE_PIXEL; i+=4 )
{
d[x+i]=s[x+i];d[x+i+1]=s[x+i+1];
d[x+i+2]=s[x+i+2];d[x+i+3]=s[x+i+3];
}

Il y a des milliers d´optimisations de ce type : ) Pour les anciens ( et actuels) µP.
De toute facon, je suis sur que tout cela deviendra depasser avec les nouvelles generations de µP.

Altonfrere
Altonfrere
Niveau 10
17 juin 2003 à 17:22:08

Les optimisations ca ne s´arrêtera jamais d´exister . ..

quant à la boucle que tu as écrite, une petit détail : d[x] et s[x] sont indépendants de la boucle sur i . ... donc tu peux très bien les factoriser . ..

char *dx = &[x], *sx = &[x];

for(int i = 0; i < NBR_DE_PIXEL; i+=4 )
{
dx[i]=sx[i]; dx[i+1]=sx[i+1];
dx[i+2]=sx[i+2];dx[i+3]=sx[i+3];
}

Chris_le_ouf
Chris_le_ouf
Niveau 5
17 juin 2003 à 17:22:55

Et pour ceux qui copie des char d´une zone a une autre dans une boucle en utilisant le cpu, grouper les 4 par 4.

ou 8 par 8 ou 16 par 16 avec les registres mmx et sse

Kouic
Kouic
Niveau 9
17 juin 2003 à 17:33:26

Vi vi, c´est vrai...
Mais quel est le cout d´une addition ou d´un test booleen ?
Es ce que ca vaux la perte de lisibilitée du code ?

Altonfrere
Altonfrere
Niveau 10
17 juin 2003 à 17:42:56

bin ca ne coute pas qu´une seule addition, mais NB_PIXEL additions : )

et entre dx[i], dx[i+1] etc . ..
et d[x+i], d[x+i+1]
je pense pas que ce soit - clair

kookii
kookii
Niveau 4
17 juin 2003 à 18:02:38

c´est pas une optimisation mais une bonne habitude qui permet d´eviter les fautes d´innatentions
lors des tests avec une constante il faut préferer
if ( 1==x) plutot que if ( x==1) car on a vite fait de faire un if ( x=1).
sinon un truc drole :
char a[10];
2[a]=5; equivaut à a[2]=5;
car en fait c´est une addition a l´adresse a+2 on ecrit 5 et comme l´adition est commutative voila pk on peut inverser.

dans les test, il faut preferer if ( a<2) plutot que if(a<=1)
il ne faut jamais faire de test d egalite sur un float, ca a une chance sur 1 million d arriver
apres des calculs.

et pour l´histoire de la boucle for, c pas + rapide de copier les char comme etant des int et dc de lancer qu´une seule affectation par pas de boucle? a mois que le compilateur le fasse lui meme je sais pas.

Passage
Passage
Niveau 10
17 juin 2003 à 18:12:46

Pour ma part je pense que la meilleur optimisation est de trouver un bon algorithme et de ne pas chasser le cycle au niveau machine comme un danné !

Par exemple:
Faire le moins possible d´allocation dynamique ( un max en statique) ou sinon un gestionnaire " maison".

Chris_le_ouf
Chris_le_ouf
Niveau 5
17 juin 2003 à 18:18:33

" dans les test, il faut preferer if ( a<2) plutot que if(a<=1)"

C´est quoi ce délire encore ?

je vois 2 cas :

_ est un entier, dans ce cas les deux tests sont strictement identiques, l´un génère un jg ( jump if greater) et l´autre un jge ( jump if greater or equal) et de toute façon c´est l´instruction jx, peu importe x elle s´execute à la même vitesse.

_a n´est pas un entier dans ce cas a peut valoir 1,5 donc la question ne se pose même pas, ce sont 2 tests différents.

Pitié si ya quelquechose de concret derrière tout ça expliquez moi j´ai peur de rater qqchose

Passage
Passage
Niveau 10
17 juin 2003 à 18:20:05

Un coup de VTune.

Chris_le_ouf
Chris_le_ouf
Niveau 5
17 juin 2003 à 18:24:52

c´est quoi VTune Passage ?

Passage
Passage
Niveau 10
17 juin 2003 à 18:25:13

Un profiler.

Passage
Passage
Niveau 10
17 juin 2003 à 18:25:56

De chez intel. Qu´est cher, mais que tu peux quand meme trouver.

Chris_le_ouf
Chris_le_ouf
Niveau 5
17 juin 2003 à 18:25:59

et ça fait quoi un profiler a part chercher les criminels ?

Passage
Passage
Niveau 10
17 juin 2003 à 18:37:23

a te dire ce que fait ton programme.
=> Donc a optimiser !

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