لماذا يؤدي استبدال 0.1f بـ 0 في حلقة إلى إبطاء الكود 10 مرات (C++, VS2010)؟
مرحباً بالجميع! أنا مبتدئ في لغة C++ وقد واجهت مشكلة غريبة جداً عند تحليل أداء الكود. لدي حلقة بسيطة تحسب مجموع المربعات. إليك الكود:
```cpp
float sum = 0.0f;
for (int i = 0; i < 100000000; ++i) {
float x = i * 0.1f; // السطر A
sum += x * x;
}
```
هذا الكود يعمل بسرعة كبيرة (حوالي 0.2 ثانية على Visual Studio 2010 في وضع Release x64). ولكن إذا استبدلت `0.1f` بـ `0` (صفر فقط):
```cpp
float sum = 0.0f;
for (int i = 0; i < 100000000; ++i) {
float x = i * 0; // السطر B
sum += x * x;
}
```
...فإن الأداء ينخفض 10 مرات! يستغرق الكود حوالي 2 ثانية. أستخدم Visual Studio 2010، مع الترجمة في وضع Release (/O2)، و SSE2 مفعل. لماذا يحدث هذا؟ فمن المفترض أن الضرب في صفر يجب أن يكون أسرع من الضرب في عدد كسري، أليس كذلك؟ لقد تحققت — النتيجة في كلتا الحالتين متطابقة (المجموع يساوي صفراً). ما الخطأ الذي أفعله؟ هل هذا خطأ في المترجم؟
ملاحظة: في وضع التصحيح (Debug) لا يوجد فرق — كلا المتغيرين يعملان بنفس السرعة.