Bonjour
La fonction suivante
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).
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; }
J'ai donc pensé à la modifier de la façon suivante
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).
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; }
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.





Répondre avec citation







Partager