Tengo un problema extraño. He siguiente fragmento de código:Optimización del compilador que hace que el rendimiento se ralentice
template<clss index, class policy>
inline int CBase<index,policy>::func(const A& test_in, int* srcPtr ,int* dstPtr)
{
int width = test_in.width();
int height = test_in.height();
double d = 0.0; //here is the problem
for(int y = 0; y < height; y++)
{
//Pointer initializations
//multiplication involving y
//ex: int z = someBigNumber*y + someOtherBigNumber;
for(int x = 0; x < width; x++)
{
//multiplication involving x
//ex: int z = someBigNumber*x + someOtherBigNumber;
if(soemCondition)
{
// floating point calculations
}
*dstPtr++ = array[*srcPtr++];
}
}
}
El bucle interno es ejecutado cerca de 200.000 veces y la función entera tarda 100 ms para su conclusión. (perfilado con AQTimer)
Encontré una variable no utilizada double d = 0.0;
fuera del bucle exterior y eliminé la misma. Después de este cambio, de repente el método está tomando 500ms para el mismo número de ejecuciones. (5 veces más lento).
Este comportamiento es reproducible en diferentes máquinas con diferentes tipos de procesadores. (Core2, procesadores dualcore).
Estoy usando el compilador VC6 con el nivel de optimización O2
. siguientes aparatos son las otras opciones del compilador utilizados:
-MD -O2 -Z7 -GR -GX -G5 -X -GF -EHa
sospeché optimizaciones del compilador y quitó la optimización del compilador /O2
. Después de que la función se volvió normal y está tomando 100ms como código anterior.
¿Alguien podría arrojar algo de luz sobre este extraño comportamiento?
¿Por qué la optimización del compilador debería ralentizar el rendimiento cuando elimino la variable no utilizada?
Nota: El código de ensamblaje (antes y después del cambio) se veía igual.
¿Estás seguro de que el conjunto se veía igual? ¿"Se ve igual" o es * exactamente * lo mismo? – jalf
es exactamente lo mismo. –