Avatar ·

Por que substituir 0.1f por 0 em um loop deixa o código 10 vezes mais lento (C++, VS2010)?

Olá a todos! Sou novo em C++ e me deparei com um problema muito estranho ao fazer profiling de código. Tenho um loop simples que calcula a soma dos quadrados. Aqui está o código: ```cpp float sum = 0.0f; for (int i = 0; i < 100000000; ++i) { float x = i * 0.1f; // linha A sum += x * x; } ``` Este código é muito rápido (cerca de 0,2 segundos no meu Visual Studio 2010 em Release x64). Mas se eu substituir `0.1f` por `0` (apenas zero): ```cpp float sum = 0.0f; for (int i = 0; i < 100000000; ++i) { float x = i * 0; // linha B sum += x * x; } ``` ...o desempenho cai 10 vezes! O código leva cerca de 2 segundos. Estou usando Visual Studio 2010, compilação em modo Release (/O2), SSE2 ativado. Por que isso acontece? Afinal, multiplicar por zero deveria ser ainda mais rápido do que por um número fracionário, não é? Eu verifiquei — o resultado é o mesmo em ambos os casos (a soma é zero). O que estou fazendo de errado? Será que é um bug do compilador? P.S. No depurador (Debug) não há diferença — ambas as varia