Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3003 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Optimisation de code

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Optimisation de code

n°2293786
ryngetsu
Only skylake and AMD GPU
Posté le 16-12-2016 à 23:08:45  profilanswer
 

Yo, est-ce que ce code est optimisable?
 

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. int main()
  5. {
  6.     int p1(0);
  7.     int p2(0);
  8.     char fin;
  9.     int vic(0);
  10.     int def(0);
  11.     int easterEgg(0);
  12.     cout << "Bienvenu ""x85"" Pierre-Feuille-Ciseaux.";
  13.     do
  14.     {
  15.         cout << "Choisis ton signe: nn";
  16.         cout << "  1: Pierre n";
  17.         cout << "  2: Feuille n";
  18.         cout << "  3: Ciseaux nn";
  19.         cout << "n Quel est ton signe? ";
  20.         do
  21.         {
  22.         cin >> p1;
  23.         cout << "nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn";
  24.         cout << "Vous avez jou""x82"": n";
  25.         switch (p1)
  26.         {
  27.         case 1:
  28.             cout << "Pierre.nn";
  29.             break;
  30.         case 2:
  31.             cout << "Feuille.nn";
  32.             break;
  33.         case 3:
  34.             cout << "Ciseaux.nn";
  35.             break;
  36.         default:
  37.             cout << "x90""ntr""x82""e invalide. Veuillez ressaisir: n";
  38.         }
  39.         }while (p1 != 1 && p1 != 2 && p1 != 3);
  40.         p2 = rand() % 3 + 1;
  41.         cout << "Votre adversaire a jou""x82"": n";
  42.         switch (p2)
  43.         {
  44.         case 1:
  45.             cout << "Pierre.nn";
  46.             break;
  47.         case 2:
  48.             cout << "Feuille.nn";
  49.             break;
  50.         case 3:
  51.             cout << "Ciseaux.nn";
  52.             break;
  53.         }
  54.         if (p1 == p2)
  55.         {
  56.             easterEgg = 0;
  57.             cout << "Match Nul. n";
  58.         }
  59.         if (p1 == 1 && p2 == 2)
  60.         {
  61.             def++;
  62.             easterEgg++;
  63.             cout << "Vous avez perdu.n";
  64.         }
  65.         if (p1 == 1 && p2 == 3)
  66.         {
  67.             vic++;
  68.             easterEgg = 0;
  69.             cout << "Vous avez gagn""x82"".n";
  70.         }
  71.         if (p1 == 2 && p2 == 1)
  72.         {
  73.             vic++;
  74.             easterEgg = 0;
  75.             cout << "Vous avez gagn""x82"".n";
  76.         }
  77.         if (p1 == 2 && p2 == 3)
  78.         {
  79.             def++;
  80.             easterEgg++;
  81.             cout << "Vous avez perdu.n";
  82.         }
  83.         if (p1 == 3 && p2 == 1)
  84.         {
  85.             def++;
  86.             easterEgg++;
  87.             cout << "Vous avez perdu.n";
  88.         }
  89.         if (p1 == 3 && p2 == 2)
  90.         {
  91.             vic++;
  92.             easterEgg = 0;
  93.             cout << "Vous avez gagn""x82"".n";
  94.         }
  95.         if (easterEgg >= 3)
  96.         {
  97.             cout << "T'es ""x85"" chier.n";
  98.         }
  99.         cout << "n Nombre de victoires: ";
  100.         cout << vic;
  101.         cout << "n Nombre de d""x82""faites: ";
  102.         cout << def;
  103.         cout << "nn Voulez-vous rejouer? ";
  104.         cin >> fin;
  105.         cout << "nnnnnnnnnnnnnnnnnnnnnn";
  106.     }while (fin != 'N');
  107.     return 0;
  108. }


 
Surtout tout ces If qui apparaissent. Merci :)


---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
mood
Publicité
Posté le 16-12-2016 à 23:08:45  profilanswer
 

n°2293790
rufo
Pas me confondre avec Lycos!
Posté le 17-12-2016 à 10:27:38  profilanswer
 

Déjà, commence par mettre des else devant les if (sauf le premier).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2293796
h3bus
Troll Inside
Posté le 17-12-2016 à 12:34:58  profilanswer
 

Fortement optimisable avec des LUT, même si le compilo le fait peut être tout seul.


---------------
sheep++
n°2293806
ryngetsu
Only skylake and AMD GPU
Posté le 17-12-2016 à 16:49:41  profilanswer
 

rufo a écrit :

Déjà, commence par mettre des else devant les if (sauf le premier).


D'accord merci.

h3bus a écrit :

Fortement optimisable avec des LUT, même si le compilo le fait peut être tout seul.


C'est quoi les LUT?


---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
n°2293809
theshockwa​ve
I work at a firm named Koslow
Posté le 17-12-2016 à 19:08:43  profilanswer
 

LUT = Lookup table
tu pourrais avoir un des tableaux qui représentent des conditions de victoire. Exemple :

 
Code :
  1. enum Result { Draw, P1Wins, P2Wins };
  2. int victoryTables[][]
  3. {
  4. // P1 == Pierre
  5. { Draw, P2Wins, P1Wins },
  6. // P1 == Feuille
  7. { P1Wins, Draw, P2Wins },
  8. // P1 == Ciseaux
  9. { P2Wins, P1Wins, Draw },
  10. };
  11. void PrintResult( int p1, int p2 )
  12. {
  13.   switch(victoryTables[p1][p2] )
  14.   {
  15.   case Draw:   cout << "Match nul" << endl; break;
  16.   case P1Wins: cout << "Gagné" << endl; break;
  17.   case P2Wins: cout << "Perdu" << endl; break;
  18.   }
  19. }
 

L'avantage, c'est que tu retire la plupart de test tests et de tes branches dans ton code. Le problème, c'est que tu utilises plus de mémoire.
Quand on considère les optimisations, c'est souvent une question de compromis. Tu peux souvent gagner du temps de calcul en mettant plus d'info en mémoire, mais accéder à cette mémoire a aussi un coût. C'est à toi, dans ton contexte, de trouver le bon équilibre entre l'utilisation mémoire et le volume de calculs que tu as à faire.

Message cité 1 fois
Message édité par theshockwave le 17-12-2016 à 19:10:55

---------------
last.fm
n°2293810
ryngetsu
Only skylake and AMD GPU
Posté le 17-12-2016 à 19:18:39  profilanswer
 

theshockwave a écrit :

LUT = Lookup table
tu pourrais avoir un des tableaux qui représentent des conditions de victoire. Exemple :

 


Code :
  1. enum Result { Draw, P1Wins, P2Wins };
  2. int victoryTables[][]
  3. {
  4. // P1 == Pierre
  5. { Draw, P2Wins, P1Wins },
  6. // P1 == Feuille
  7. { P1Wins, Draw, P2Wins },
  8. // P1 == Ciseaux
  9. { P2Wins, P1Wins, Draw },
  10. };
  11. void PrintResult( int p1, int p2 )
  12. {
  13.   switch(victoryTables[p1][p2] )
  14.   {
  15.   case Draw:   cout << "Match nul" << endl; break;
  16.   case P1Wins: cout << "Gagné" << endl; break;
  17.   case P2Wins: cout << "Perdu" << endl; break;
  18.   }
  19. }


L'avantage, c'est que tu retire la plupart de test tests et de tes branches dans ton code. Le problème, c'est que tu utilises plus de mémoire.
Quand on considère les optimisations, c'est souvent une question de compromis. Tu peux souvent gagner du temps de calcul en mettant plus d'info en mémoire, mais accéder à cette mémoire a aussi un coût. C'est à toi, dans ton contexte, de trouver le bon équilibre entre l'utilisation mémoire et le volume de calculs que tu as à faire.


Merci je retiens cette méthode, mais comme bon débutant je vais rester simple pour l'instant. Merci de votre aide :)


Message édité par ryngetsu le 17-12-2016 à 19:19:29

---------------
Tout le monde est un génie. Mais si on juge un poisson sur sa capacité à grimper à un arbre, il passera sa vie à croire qu’il est stupide. – Albert Einstein
n°2293811
antiseptiq​ueincolore
Posté le 17-12-2016 à 19:35:08  profilanswer
 

_c'est_ simple.
 
Sinon si tu veux rester sur ton code à base de elseif, tu pourrais factoriser un peu  

Code :
  1. if (p1==1)
  2. {
  3.      if (p2==1) blabla
  4.      else if (p2 ==2) blabla
  5.      else if (p3==3) blabla
  6. }
  7. else if(p1==2)
  8. {
  9. }
  10. etc etc...


de cette manière, tu réduis considérablement le nombre de tests réalisés avant d'arriver sur la partie qui s'occupe du cas en question.
L'étape d'optimisation d'après étant effectivement de passer à la lookup table. Ça s'y prête, tu n'as pas de raison de t'en priver.
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Optimisation de code

 

Sujets relatifs
Macro trop lente, optimisation du codeoptimisation de code
[RESOLU] [VBA] - EXCEL 2010 - Optimisation de code[VB6] Simplification et optimisation code
Optimisation du codeOptimisation code php
[VBA] Optimisation de codeoptimisation SSE pour du code C (auto ou inline) [résolu]
optimisation du code c++Optimisation de code javascript
Plus de sujets relatifs à : Optimisation de code


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR