لماذا كود 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 ملايين)...