include <stdio.h> int main() { double i = 32121.2189281; int cpt; int cpt2; for(cpt2 = 0; cpt2 < 1000; ++cpt2) for(cpt = 0; cpt < ((i*i*i*i)/(i*i*1281.121)); ++cpt) ; return 0; }
#include <stdio.h> int main() { double i = 32121.2189281; int cpt; int cpt2; i = ((i*i*i*i)/(i*i*1281.121)); for(cpt2 = 0; cpt2 < 1000; ++cpt2) for(cpt = 0; cpt < i; ++cpt) ; return 0; }
#include <stdio.h> int main() { const double i = 32121.2189281; int cpt; int cpt2; for(cpt2 = 0; cpt2 < 1000; ++cpt2) for(cpt = 0; cpt < ((i*i*i*i)/(i*i*1281.121)); ++cpt) ; return 0; }
Avec les options de compilation par défaut. On remarque que la valeur de test est calculée à chaque itération.
$ gcc testC.c -o tt $ time ./tt real 0m13.612s user 0m13.501s sys 0m0.000s
$ gcc testC2.c -o tt $ time ./tt real 0m3.019s user 0m2.984s sys 0m0.000s
$ gcc testC3.c -o tt $ time ./tt real 0m13.476s user 0m13.433s sys 0m0.012s
Avec l'option d'optimisation -O2. La valeur du test est précalculé. Et ceux même si cette valeur contient une variable. Que se passe t-il si la variable est sur une zone de mémoire partagée ou si plusieurs flôts de controles y accedent ?
$ gcc testC.c -o tt -O2 $ time ./tt real 0m3.138s user 0m2.996s sys 0m0.000s
$ gcc testC2.c -o tt -O2 $ time ./tt real 0m3.151s user 0m3.032s sys 0m0.000s
$ gcc testC3.c -o tt -O2 $ time ./tt real 0m3.064s user 0m3.044s sys 0m0.000s