Optimisation de code

Optimisation de code - C++ - Programmation

Marsh Posté le 16-12-2016 à 23:08:45    

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
Reply

Marsh Posté le 16-12-2016 à 23:08:45   

Reply

Marsh Posté le 17-12-2016 à 10:27:38    

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
Reply

Marsh Posté le 17-12-2016 à 12:34:58    

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


---------------
sheep++
Reply

Marsh Posté le 17-12-2016 à 16:49:41    

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
Reply

Marsh Posté le 17-12-2016 à 19:08:43    

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
Reply

Marsh Posté le 17-12-2016 à 19:18:39    

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
Reply

Marsh Posté le 17-12-2016 à 19:35:08    

_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.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed