loptimizz 2.39 KB
///////////////////////////////////////////     Optimisation 2/5  ////////////////////////////////////////////////////

exercices : "fonctions imbriquées"

Le compilateur voit bien l'utilité de la fonction "oppose" et remplace directement par des "-" .








exercices "calcul du gain"

On ajoute deux dimensions au tableau ( a[1000][1000][1000] )

et on voit bien la différence 

avec optimisation : 
real    0m7.410s
user    0m6.728s
sys     0m0.672s
                                  il est environ 1.5 fois plus rapide

sans optimisation :
real    0m10.000s
user    0m9.364s
sys     0m0.624s



avec a[100][500][500]

optimisé :
real    0m0.245s
user    0m0.216s
sys     0m0.028s
                           il est presque deux fois plus rapide avec la version optimisée

non optimisé :
real    0m0.405s
user    0m0.384s
sys     0m0.020s


exercices "multiplication récursive"

plus aboutie car le compilateur remplace directement les additions par une multiplication


///////////////////////////////////////////     Optimisation 3/5  ////////////////////////////////////////////////////


Exercice de code mort

je modifie legerement le programme 

#include <stdio.h>
int main(void){
int a=0;
if(a==2) printf("Bonjour \n");
printf("Coucou !\n");
a=1;
return a;
printf("Caché !\n");
}

et le compile
résultat : 

;; Function main (main, funcdef_no=11, decl_uid=2234, symbol_order=11) (executed once)

main ()
{
  <bb 2>:
  __builtin_puts (&"Coucou !"[0]);
  return 1;

}

Le compilateur enlève la ligne if(a==2) printf("Bonjour \n"); qui ne s'executerait jamais --> Code mort


Exercice de propagation :

en modifiant le code de cette manière puis en compilant (avec -03) j'obtient :

 int main(void){
int a=1,b=2,c=3, i=2;
int d=a*c,e=d+2*b;
while(i > 0) { i--; if(e!=2) e--; }
return e;
}


;; Function main (main, funcdef_no=0, decl_uid=1743, symbol_order=0) (executed once)

main ()
{
  int e;
  int i;

  <bb 2>:
  return 5;

}

C'est assez impressionant !

Exercice second degre :

#include <stdio.h>
#include <math.h>

int main() {
  int a,b,c;
  scanf("%d,%d,%d",&a,&b,&c);
  float r1, r2;

if(b*b-4*a*c > 0) { r1=(-b-sqrt(b*b-4*a*c))/(2*a); r2=(-b+sqrt(b*b-4*a*c))/(2*a); printf("r1 = %f   \nr2 = %f",r1,r2);}

if(b*b-4*a*c == 0) { r1 = -b/(2*a); r2=r1; printf("r1 = %f   \nr2 = %f",r1,r2); }

if(b*b-4*a*c < 0) printf("pas de racine");

return 0;

}
  
 
 Pour ce code le compilateur recalcule le delta au moins une fois