/////////////////////////////////////////// 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 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 () { : __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; : return 5; } C'est assez impressionant ! Exercice second degre : #include #include 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