Avatar ·

لماذا كود C++ لاختبار فرضية كولاتز أسرع من الإدراج اليدوي بلغة التجميع؟

مرحباً بالجميع! أنا أدرس C++ ولغة التجميع، وقررت اختبار فرضية كولاتز (3n+1) للأعداد الكبيرة. كتبت نسختين من الكود: واحدة بلغة C++ خالصة مع تحسينات، والأخرى بإدراج يدوي بلغة التجميع لـ x86-64. توقعت أن تكون لغة التجميع أسرع، لكن حصلت على نتيجة عكسية.

هذا هو كود C++ الخاص بي (تم تجميعه مع -O2 في 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;
}

وهذه هي النسخة مع الإدراج بلغة التجميع (باستخدام نمط MSVC __asm):

int collatz_asm(uint64_t n) {
    int steps = 0;
    __asm {
        mov rax, n
        xor ecx, ecx        ; st