En induktiv variabel är en variabel i cykler vars successiva värden bildar en aritmetisk progression. Det vanligaste exemplet är loopräknaren. Induktiva variabler används ofta i arrayindexuttryck.
Till exempel, i följande exempel, ioch jär induktiva variabler:
för ( i = 0 ; i < 10 ; i ++ ) { j = 17 * i ; }Traditionella optimeringsmetoder innebär att känna igen induktiva variabler och ta bort dem från slingan.
Den allmänna optimeringsprincipen är att känna igen induktiva variabler och ersätta dem med enkla beräkningar. Till exempel kan koden ovan modifieras av en optimeringskompilator , baserat på antagandet att konstant addition skulle vara billigare än multiplikation:
j = -17 ; för ( i = 0 ; i < 10 ; i ++ ) { j = j + 17 _ }Denna applikation är ett specialfall av kostnadsreduktionsoptimering .
I vissa fall kan du använda denna optimering för att helt ta bort den induktiva variabeln från din kod. Till exempel:
extern int summa ; int foo ( int n ) { int i , j ; j = 5 _ för ( i = 0 ; i < n ; i ++ ) { j += 2 ; summa += j ; } retursumma ; _ }Slingan i funktionen har två induktiva variabler: ioch j. En av dem kan representeras som en linjär funktion av den andra, så kompilatorn kan optimera denna kod enligt följande:
extern int summa ; int foo ( int n ) { int i ; för ( i = 0 ; i < n ; i ++ ) { summa += ( 5 + 2 * ( i + 1 )); } retursumma ; _ }En induktiv variabelsubstitution är en transformation som känner igen variabler som kan representeras som en funktion av ett loopindex och ersätter dem med motsvarande uttryck. Denna konvertering gör relationerna mellan variabler och loopindex explicita, vilket hjälper andra kompilatoroptimeringar. Tänk på ett exempel:
int c , i ; c = 10 _ för ( i = 0 ; i < 10 ; i ++ ) { c = c + 5 ; // c ökar med 5 på varje iteration av loopen }I enlighet med metoden som beskrivs ovan får vi följande representation av källkoden:
int c , i ; c = 10 _ för ( i = 0 ; i < 10 ; i ++ ) { c = 10 + 5 * ( i + 1 ); // c är en funktion av index }Samma optimeringar kan tillämpas på induktiva variabler som inte är linjära funktioner hos loopräknaren. Till exempel följande kod:
j = 1 _ för ( i = 0 ; i < 10 ; i ++ ) { j = j << 1 ; }kan konverteras:
för ( i = 0 ; i < 10 ; i ++ ) { j = 1 << i + 1 ; }