Avatar ·

لماذا يؤدي استبدال 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) لا يوجد فرق — كلا المتغيرين يعملان بنفس السرعة.