Una variable inductiva es una variable en ciclos cuyos valores sucesivos forman una progresión aritmética. El ejemplo más común es el contador de bucles. Las variables inductivas se utilizan a menudo en expresiones de índice de matriz.
Por ejemplo, en el siguiente ejemplo, iy json variables inductivas:
para ( yo = 0 ; yo < 10 ; yo ++ ) { j = 17 * yo ; }Los métodos de optimización tradicionales implican el reconocimiento de variables inductivas y su eliminación del bucle.
El principio general de optimización es reconocer variables inductivas y reemplazarlas con cálculos simples. Por ejemplo, el código anterior podría ser modificado por un compilador optimizador , basado en la suposición de que la suma constante sería más económica que la multiplicación:
j = -17 ; para ( yo = 0 ; yo < 10 ; yo ++ ) { j = j + 17 _ }Esta aplicación es un caso especial de optimización de reducción de costos .
En algunos casos, puede usar esta optimización para eliminar por completo la variable inductiva de su código. Por ejemplo:
suma interna externa ; int foo ( int n ) { int i , j ; j = 5 _ para ( yo = 0 ; yo < norte ; yo ++ ) { j += 2 ; suma += j ; } suma devuelta ; _ }El ciclo en la función tiene dos variables inductivas: iy j. Uno de ellos se puede representar como una función lineal del otro, por lo que el compilador puede optimizar este código de la siguiente manera:
suma interna externa ; int foo ( int n ) { ent i ; para ( yo = 0 ; yo < norte ; yo ++ ) { suma += ( 5 + 2 * ( i + 1 )); } suma devuelta ; _ }Una sustitución de variable inductiva es una transformación que reconoce variables que se pueden representar como una función de un índice de bucle y las reemplaza con las expresiones correspondientes. Esta conversión hace explícitas las relaciones entre las variables y los índices de bucle, lo que ayuda a otras optimizaciones del compilador. Considere un ejemplo:
intc , yo ; _ c = 10 _ para ( yo = 0 ; yo < 10 ; yo ++ ) { c = c + 5 ; // c se incrementa en 5 en cada iteración del ciclo }De acuerdo con el método descrito anteriormente, obtenemos la siguiente representación del código fuente:
intc , yo ; _ c = 10 _ para ( yo = 0 ; yo < 10 ; yo ++ ) { c = 10 + 5 * ( yo + 1 ); // c es una función de índice }Las mismas optimizaciones se pueden aplicar a variables inductivas que no son funciones lineales del contador de bucle. Por ejemplo, el siguiente código:
j = 1 _ para ( yo = 0 ; yo < 10 ; yo ++ ) { j = j << 1 ; }se puede convertir:
para ( yo = 0 ; yo < 10 ; yo ++ ) { j = 1 << yo + 1 ; }