Bonjour

La fonction suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
uint64_t  f1(int64_t a, int64_t p)
{
   int64_t u = p, v = a, r = 0, s = 1;
   while(u != v){  
      if(u > v){
         u -= v;
        // code1
      }else{
         v -= u;
         // code2
      }
   }
   return s;
}
effectue une soustraction et 2 tests de comparaison, chacun ayant un de temps d'execution équivalent à celui d'une soustraction (rectifiez moi si je me trompe).
J'ai donc pensé à la modifier de la façon suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
uint64_t  f2(int64_t a, int64_t p)
{
   int64_t u = p, v = a, r = 0, s = 1, w;
   while( (w = u - v) != 0){  
      if(w > 0){
         u  = w;
        // code1
      }else{
         v = -w;
         // code2
      }
   }
   return s;
}
A la place de 3 "soustractions", cette nouvelle fonction effectue une soustraction avec affectation (dans w) et un test du bit de signe (les autres affectations sont les mêmes).

Je ne m'attendais pas à un gain énorme mais à ma grande surprise f2 est 20 à 25% plus lente que f1.

Avez vous une explication ?
Merci d'avance.