Avatar ·

Por que o código C++ para verificar a hipótese de Collatz é mais rápido que o assembly escrito manualmente?

Estou estudando C++ e assembly x86, e decidi escrever um programa para verificar a hipótese de Collatz (3n+1). A ideia é simples: pegue um número, se for par — divida por 2, se for ímpar — multiplique por 3 e adicione 1. É preciso contar quantos passos são necessários para chegar a 1. Primeiro, escrevi o código em 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; } ``` Depois, escrevi manualmente uma versão em assembly, usando instruções x86-64, pensando que seria mais 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 ``` Mas quando medi o desempenho em números grandes (por exemplo, de 1 a 10 m