Avatar ·

¿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