¿Por qué el código en C++ para verificar la conjetura de Collatz es más rápido que el ensamblador escrito a mano?
Estoy estudiando C++ y ensamblador x86, y decidí escribir un programa para verificar la conjetura de Collatz (3n+1). La idea es simple: tomamos un número, si es par — lo dividimos entre 2, si es impar — lo multiplicamos por 3 y sumamos 1. Necesitamos contar cuántos pasos se requieren para llegar a 1.
Primero escribí el código 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;
}
```
Luego escribí manualmente una versión en ensamblador, usando instrucciones x86-64, pensando que sería más rápida:
```asm
collatz_asm:
xor eax, eax ; steps = 0
.loop:
cmp edi, 1
je .done
test edi, 1
jnz .odd
shr edi, 1 ; par: n /= 2
inc eax
jmp .loop
.odd:
lea edi, [edi*2+edi+1] ; n = 3*n + 1
inc eax
jmp .loop
.done:
ret
```
Pero cuando medí el rendimiento con números grandes (por ejemplo, de 1 a 10 m