que tiene un segmento de código que es tan simple como:Intel C++ Compiler comprensión de lo que la optimización se realiza
for(int i = 0; i < n; ++i)
{
if(data[i] > c && data[i] < r)
{
--data[i];
}
}
Es una parte de una función grande y proyecto. Esto es en realidad una reescritura de un bucle diferente, que resultó ser mucho tiempo (bucles largos), pero fue sorprendido por dos cosas:
Cuando los datos [i] fue temporal almacenada como esto:
for(int i = 0; i < n; ++i)
{
const int tmp = data[i];
if(tmp > c && tmp < r)
{
--data[i];
}
}
Se hizo mucho más lento. No pretendo que esto sea más rápido, pero no puedo entender por qué debería ser mucho más lento, el compilador debería poder determinar si debe usarse o no el tmp.
Pero más importante aún, cuando moví el segmento de código a una función separada, se volvió cuatro veces más lento. Quería entender lo que estaba pasando, así que busqué en el informe opt-in y en ambos casos el loop se vectoriza y parece que hace la misma optimización.
Así que mi pregunta es ¿qué puede hacer una gran diferencia en una función que no se llama un millón de veces, pero consume mucho tiempo en sí misma? ¿Qué buscar en el opt-report?
Podría evitarlo simplemente manteniéndolo en línea, pero el por qué me está molestando.
ACTUALIZACIÓN:
debo subrayar que mi principal preocupación es entender, ¿por qué se hizo más lento, cuando se mueve a una función separada. El ejemplo de código proporcionado con la variable tmp, fue solo un extraño ejemplo que encontré durante el proceso.
Simplemente la pregunta obligatoria: ¿tiene optimizaciones máximas en todas las construcciones? – GManNickG
Intente echar un vistazo al ensamblaje generado. –
Sí, todo está compilado con O3. No he mirado todavía la asamblea, simplemente porque, como dije, es parte de un gran proyecto (también porque no soy un experto en ensamblaje). –