Avatar ·

¿Por qué reemplazar 0.1f por 0 en un bucle ralentiza el código 10 veces (C++, VS2010)?

¡Hola a todos! Soy nuevo en C++ y me encontré con un problema muy extraño al perfilar código. Tengo un bucle simple que calcula la suma de cuadrados. Aquí está el código: ```cpp float sum = 0.0f; for (int i = 0; i < 100000000; ++i) { float x = i * 0.1f; // línea A sum += x * x; } ``` Este código funciona muy rápido (alrededor de 0.2 segundos en mi Visual Studio 2010 en Release x64). Pero si reemplazo `0.1f` por `0` (simplemente cero): ```cpp float sum = 0.0f; for (int i = 0; i < 100000000; ++i) { float x = i * 0; // línea B sum += x * x; } ``` ...entonces el rendimiento cae 10 veces. El código se ejecuta en aproximadamente 2 segundos. Uso Visual Studio 2010, compilación en modo Release (/O2), SSE2 habilitado. ¿Por qué sucede esto? Después de todo, multiplicar por cero debería ser incluso más rápido que por un número fraccionario, ¿no? Verifiqué: el resultado en ambos casos es el mismo (la suma es cero). ¿Qué estoy haciendo mal? ¿Quizás es un bug del compilador? P.D. En Debug no hay diferencia: ambas variantes