لماذا يؤدي استبدال 0.1f بـ 0 إلى إبطاء الكود بمقدار 10 مرات في Visual Studio 2010؟
مرحبًا بالجميع! أكتب بلغة C++ في Visual Studio 2010. كتبت حلقة بسيطة لحسابات الفاصلة العائمة، لكن لاحظت سلوكًا غريبًا. إذا كان في شرط الحلقة الرقم 0.1f، يعمل الكود بسرعة. إذا استبدلته بـ 0 (أو أي رقم صحيح آخر، مثل 1)، ينخفض الأداء بمقدار 10 مرات تقريبًا. إليك مثال:
```cpp
const float x = 1.0f;
for (int i = 0; i < 100000000; ++i) {
// الإصدار السريع: if (x < 0.1f)
// الإصدار البطيء: if (x < 0)
}
```
أقوم بالتجميع في وضع Release مع تحسينات /O2. لماذا هذا الفرق؟ هل المترجم يفعل شيئًا خاطئًا؟ أم أنها ميزة SSE/FPU؟ سأكون ممتنًا للشرح، لأنني في حيرة. شكرًا مقدمًا!
<<>>
جذر المشكلة: الأعداد غير المعيارية والعقوبة على معالجتها
الفرق في الأداء مرتبط بكيفية معالجة المعالج للأعداد غير المعيارية (subnormal numbers). عندما تقارن float x = 1.0f مع 0، تكون النتيجة false، و