loptimizz
2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/////////////////////////////////////////// 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