لماذا الجمع العنصري في حلقتين منفصلتين أسرع من حلقة واحدة مدمجة؟
مرحباً بالجميع! أكتب بلغة 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) تعمل النسخة الأولى **أسرع مرتين تقريباً**! لماذا؟ ففي النسخة الثانية عمليات أقل مع المؤشرات وفحوصات أقل للحدود. اشرحوا لي، من فضلكم، ما يحدث تحت الغطاء. هل هذا مرتبط