Pourquoi le code C++ pour vérifier la conjecture de Collatz est-il plus rapide qu'une insertion assembleur écrite à la main ?
Bonjour à tous ! J'étudie le C++ et l'assembleur, et j'ai décidé de vérifier la conjecture de Collatz (3n+1) pour de grands nombres. J'ai écrit deux versions du code : une en C++ pur avec optimisations, et une autre avec une insertion assembleur manuelle pour x86-64. Je m'attendais à ce que l'assembleur soit plus rapide, mais j'ai obtenu le résultat inverse.
Voici mon code C++ (compilé avec -O2 dans GCC) :
#include <iostream>
#include <cstdint>
int collatz_steps(uint64_t n) {
int steps = 0;
while (n != 1) {
if (n % 2 == 0) {
n /= 2;
} else {
n = 3 * n + 1;
}
steps++;
}
return steps;
}
int main() {
uint64_t max_n = 1000000;
for (uint64_t i = 1; i <= max_n; ++i) {
collatz_steps(i);
}
return 0;
}
Et voici la version avec insertion assembleur (utilisant le style MSVC __asm) :
int collatz_asm(uint64_t n) {
int steps = 0;
__asm {
mov rax, n
xor ecx, ecx ; st