Pourquoi le code C++ pour vérifier la conjecture de Collatz est plus rapide que l'assembleur écrit à la main ?
J'étudie le C++ et l'assembleur x86, et j'ai décidé d'écrire un programme pour vérifier la conjecture de Collatz (3n+1). L'idée est simple : on prend un nombre, s'il est pair on le divise par 2, s'il est impair on le multiplie par 3 et on ajoute 1. Il faut compter combien d'étapes sont nécessaires pour atteindre 1.
D'abord, j'ai écrit le code en C++ :
```cpp
int collatz(int n) {
int steps = 0;
while (n != 1) {
if (n % 2 == 0)
n /= 2;
else
n = 3 * n + 1;
steps++;
}
return steps;
}
```
Ensuite, j'ai écrit manuellement une version en assembleur, en utilisant les instructions x86-64, pensant qu'elle serait plus rapide :
```asm
collatz_asm:
xor eax, eax ; steps = 0
.loop:
cmp edi, 1
je .done
test edi, 1
jnz .odd
shr edi, 1 ; pair : n /= 2
inc eax
jmp .loop
.odd:
lea edi, [edi*2+edi+1] ; n = 3*n + 1
inc eax
jmp .loop
.done:
ret
```
Mais quand j'ai mesuré les performances sur de grands nombres (par exemple, de 1 à 10 m
No answers yet.
Connectez-vous pour laisser une réponse