Optimisations

Calculs dans la zone de test d'une boucle for

Fichiers

testC.c

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;
}

testC2.c

#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;
}

testC3.c

#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;
}

Tests

1

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

2

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

 
prog/gcc.txt · Dernière modification: 2009/07/25 09:58 par trizolakai
 
Sauf mention contraire, le contenu de ce wiki est placé sous la licence suivante:GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki