Avatar ·

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

أنا أدرس C++ وأسمبلي x86، وقررت كتابة برنامج لاختبار فرضية كولاتز (3n+1). الفكرة بسيطة: نأخذ رقمًا، إذا كان زوجيًا نقسمه على 2، وإذا كان فرديًا نضربه في 3 ونضيف 1. نحتاج حساب عدد الخطوات اللازمة للوصول إلى 1. أولاً كتبت كود 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; } ``` ثم كتبت يدويًا نسخة الأسمبلي باستخدام تعليمات x86-64، معتقدًا أنها ستكون أسرع: ```asm collatz_asm: xor eax, eax ; steps = 0 .loop: cmp edi, 1 je .done test edi, 1 jnz .odd shr edi, 1 ; زوجي: n /= 2 inc eax jmp .loop .odd: lea edi, [edi*2+edi+1] ; n = 3*n + 1 inc eax jmp .loop .done: ret ``` لكن عندما قمت بقياس الأداء على أرقام كبيرة (مثل من 1 إلى 10 ملايين)...