En informática , la inversión de bucle es una optimización del compilador y una transformación de bucle en la que un bucle while se reemplaza por un bloque if que contiene un bucle do.. while . Cuando se usa correctamente, puede mejorar el rendimiento debido a la canalización de instrucciones .
Ejemplo en C
int i , a [ 100 ]; i = 0 ; mientras que ( i < 100 ) { a [ i ] = 0 ; i ++ ; }
es equivalente a:
int i , a [ 100 ]; i = 0 ; si ( i < 100 ) { do { a [ i ] = 0 ; i ++ ; } mientras ( i < 100 ); }
A pesar de la aparentemente mayor complejidad del segundo ejemplo, en realidad puede ejecutarse más rápido en las CPU modernas porque usan una canalización de instrucciones . Por naturaleza, cualquier salto en el código provoca un bloqueo de la tubería , lo que es un perjuicio para el rendimiento.
Además, la inversión de bucle permite un movimiento de código invariante de bucle seguro .
Ejemplo en código de tres direcciones
yo: = 0 L1: si i> = 100 pasa a L2 a [i]: = 0 yo: = yo + 1 ir a L1 L2:
Si me hubiera inicializado en 100, las instrucciones ejecutadas en tiempo de ejecución habrían sido:
si i> = 100 ir a L2
Supongamos que i se ha inicializado a un valor menor que 100. Ahora veamos las instrucciones ejecutadas en el momento después de que i se haya incrementado a 99 en el ciclo:
ir a L1 si yo <100 a [i]: = 0 yo: = yo + 1 ir a L1 si i> = 100 ir a L2 << en L2 >>
Ahora, veamos la versión optimizada:
yo: = 0 si i> = 100 goto L2 L1: a [i]: = 0 yo: = yo + 1 si yo <100 goto L1 L2:
Nuevamente, veamos las instrucciones ejecutadas si i se inicializa en 100:
si i> = 100 ir a L2
No desperdiciamos ningún ciclo en comparación con la versión original. Ahora considere el caso en el que i se ha incrementado a 99:
si yo <100 ir a L1 a [i]: = 0 yo: = yo + 1 si yo <100 << en L2 >>
Como puede ver, se han eliminado dos goto s (y por lo tanto, dos puestos de tubería) en la ejecución.