Ok, antes que nada, no sé cómo los compiladores lo hacen automáticamente. Y estoy bastante seguro de que hay al menos 10s si no cientos de algoritmos de los que los compiladores tienen que elegir.
Y, sin embargo, es probablemente un compilador específico.
Pero puedo ayudarlo a calcular su efectividad.
Solo tenga en cuenta que esta técnica por lo general no le da un gran aumento de rendimiento.
Pero en cálculos repetidos en bucle y puede dar un alto porcentaje de rendimiento.
Esto se debe a que, por lo general, la función dentro del ciclo requiere mucho más tiempo de cálculo que la verificación de estado del ciclo.
Por lo tanto, digamos que tenemos un bucle simple con una constante, porque estabas demasiado perezosos para hacer copiar y pegar o simplemente pensó que se vería mejor:
for (int i = 0; i < 5; i++)
{
DoSomething();
}
Aquí tienes comparaciones int , Incrementaciones, y DoSomethig() llamadas.
Entonces, si DoSomething() es relativamente rápido, entonces obtuvimos operaciones.
Ahora, si desenrolla esto, se va a reducir a sólo 5 operaciones:
DoSomething();
DoSomething();
DoSomething();
DoSomething();
DoSomething();
Ahora, con constantes Es más fácil, por lo que permite ver cómo funcionaría con una variable:
for (int i = 0; i < n; i++)
{
DoSomething();
}
Aquí tienen n comparaciones INT, n incrementations y n DoSomethig() llama = 3n . Ahora bien, no se puede desenrollar por completo, pero podría desenrollarlo por un factor constante (cuanto más alto se espera n a ser, más debemos desenrollarlo):
int i;
for (i = 0; i < n; i = i+3)
{
DoSomething();
DoSomething();
DoSomething();
}
if (i - n == 2)
{
DoSomething(); // We passed n by to, so there's one more left
}
else if (i - n == 1)
{
DoSomething(); //We passed n by only 1, so there's two more left
DoSomething();
}
Ahora aquí tenemos aquí tienes n/3 + 2 comparaciones int, n/3 incrementations y n DoSomethig() llama a = (1 2/3) * n.
Nos hemos ahorrado (1 1/3) * n operaciones. Lo que reduce el tiempo de cálculo casi a la mitad.
FYI, otra técnica de desenrollado ordenada se llama Duff's device.
Pero es muy específico de compilación e implementación de lenguaje. Hay idiomas donde esto sería peor.
¿Está buscando un documento sobre el análisis de optimización del compilador? :) – Jon
Me gustaría agregar: ¿por qué el mensaje de ayuda de gcc dice -funroll-all-loops en realidad hace que el programa se ejecute más lento? Citando: "Realice la optimización de desenrollado del bucle. Esto se realiza para todos los bucles y generalmente hace que los programas se ejecuten más lentamente". – BlackBear
@Jon, no importa, solo necesito una buena respuesta. –