Deux programmes avec des performances paradoxales
Bonjour
La fonction suivante
Code:
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:
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.