EDITAR: Después de quitar el UB (punto bueno, lo perdí), los tiempos son más o menos idénticos. Marcará a un moderador para eliminarlo.¿Por qué el movimiento de regreso al final de la función es menos eficiente?
Estas dos funciones son idénticos excepto por el hecho de que foo
tiene el retorno dentro de la if
, en ambas ramas, mientras que goo
tiene un único return
al final:
int foo()
{
static int x = 0;
if (x)
{
x > 2 ? x = 0 : ++x;
return x-1;
}
else
{
x++;
return x-1;
}
}
int goo()
{
static int x = 0;
if (x)
{
x > 2 ? x = 0 : ++x;
}
else
{
x++;
}
return x-1;
}
Los números están ahí tan las optimizaciones no se activan demasiado y la llamada de función no se optimiza. Compilado con optimización completa en MSVS 2010.
Llamar a la función 4000000000 veces, la muestra 10 veces, foo
fue siempre más rápido:
foo
- 8830 ms promediogoo
- 8703 ms promedio
La diferencia es pequeña, pero está ahí. ¿Por qué? Además, ¿por qué el compilador no los optimiza para lo mismo?
¿Ha comprobado la salida del ensamblador? –
@larsmans sí, la función está en línea y la primera es * más grande * (aunque toma menos). También estoy investigando los motivos ** por los que ** el compilador no ve las optimizaciones que está haciendo para uno de ellos. –
¿Miraste el código ASM que se produjo? –