Avatar ·

لماذا الجمع العنصري في حلقتين منفصلتين أسرع من حلقة واحدة مدمجة؟

مرحباً بالجميع! أكتب بلغة C++ منذ بضعة أشهر، وقد واجهت سلوك أداء غريب جداً. هناك مصفوفتان: `a` و `b` بحجم 200000000 عنصر (حوالي 800 ميجابايت لكل منهما). أريد جمع كل عنصر على حدة وتخزين النتيجة في مصفوفة `c`، ثم ضرب كل عنصر من `c` في 2 وتخزينه في `d`. كتبت نسختين من الكود: **النسخة 1 (حلقتان منفصلتان):** ```cpp for (int i = 0; i < n; ++i) { c[i] = a[i] + b[i]; } for (int i = 0; i < n; ++i) { d[i] = c[i] * 2; } ``` **النسخة 2 (حلقة واحدة مدمجة):** ```cpp for (int i = 0; i < n; ++i) { c[i] = a[i] + b[i]; d[i] = c[i] * 2; } ``` توقعت أن تكون النسخة الثانية أسرع لأنها تفعل كل شيء في مسار واحد. لكن في الممارسة (المترجم MSVC، الأعلام /O2، معمارية x64) تعمل النسخة الأولى **أسرع مرتين تقريباً**! لماذا؟ ففي النسخة الثانية عمليات أقل مع المؤشرات وفحوصات أقل للحدود. اشرحوا لي، من فضلكم، ما يحدث تحت الغطاء. هل هذا مرتبط