Avatar ·

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