C valodas koda optimizcija Dmitrijs Rutko Saturs Vsture

  • Slides: 21
Download presentation
C valodas koda optimizācija Dmitrijs Rutko

C valodas koda optimizācija Dmitrijs Rutko

Saturs Vēsture n Attīstība n Uzdevumi n Optimizācijas līmeņi un stadijas n Optimizācijas metodes

Saturs Vēsture n Attīstība n Uzdevumi n Optimizācijas līmeņi un stadijas n Optimizācijas metodes n

Attīstības virzieni C standarti n Kompilācijas laiks n Koda pārnesamība n Optimizācija n

Attīstības virzieni C standarti n Kompilācijas laiks n Koda pārnesamība n Optimizācija n

Kompilatoru uzdevumi Koda translācija n Optimizācija n Izmērs n Ātrdarbība n n Algoritma izvēle

Kompilatoru uzdevumi Koda translācija n Optimizācija n Izmērs n Ātrdarbība n n Algoritma izvēle paliek galvenā

Optimizācija līmeņi Operators n Bloks n Cikls n Procedūra n Programma n

Optimizācija līmeņi Operators n Bloks n Cikls n Procedūra n Programma n

Optimizācijas stadijas Izejas teksts -> starpforma n Platformas neatkarīga optimizācija n Platformas atkarīga optimizācija

Optimizācijas stadijas Izejas teksts -> starpforma n Platformas neatkarīga optimizācija n Platformas atkarīga optimizācija n

“Konstanšu / kopiju vairošana” x = 2; if( a < x && b <

“Konstanšu / kopiju vairošana” x = 2; if( a < x && b < x) c = x; x = 2; if(a < 2 && b < 2) c = 2; x = y; if(a < x && b < x) c = x; x = y; if(a < y && b < y) c = y;

“Konstantu savēršana” #define TWO 2 a = 1 + TWO; a = 3; x

“Konstantu savēršana” #define TWO 2 a = 1 + TWO; a = 3; x = y + 0; x = y * 0; x = y / 1. 0; x = y / 0; // Kļūda

Kopējas izteiksmes if( a[y*3] < 0 || b[y*3] > 10) a[y*3] = 0; T

Kopējas izteiksmes if( a[y*3] < 0 || b[y*3] > 10) a[y*3] = 0; T 1 = y*3; A 1 = &a[T 1]; A 2 = &b[T 1]; if( *A 1 < 0 || *A 2 > 10) *A 1 = 0;

Kopējas izteiksmes (turp. ) if(a == 0) a = y * 3; else b

Kopējas izteiksmes (turp. ) if(a == 0) a = y * 3; else b = y * 3; T 1 = y * 3; if(a == 0) a = T 1; else b = T 1;

Kopējas izteiksmes (turp. ) if((h 3 + k 3) < 0 || (h 3

Kopējas izteiksmes (turp. ) if((h 3 + k 3) < 0 || (h 3 + k 3) > 5) printf(“. . . ”); mov AX, h 3 add AX, k 3 jl @18 mov AX, h 3 add AX, k 3 cmp AX, 5 jle @17 @18: mov AX, offset s@ push AX call printf mov SP, BP @17: mov AX, h 3 add AX, k 3 js L 0187 cmp AX, 5 jle L 0193 L 0187: mov AX, 01. 0000 push AX call printf add SP, 2 L 0193:

Citas metodes n Stipruma samazināšana n n Reizināšanas un dalīšanas aizvietošana ar nobīdes operāciju

Citas metodes n Stipruma samazināšana n n Reizināšanas un dalīšanas aizvietošana ar nobīdes operāciju Nesasniedzama koda izslēgšana #define DEBUG 0 if(DEBUG) printf("Debug Functionn"); n Lieku piešķiršanu izslēgšana a = 5; b = 0; a = b;

Mainīgo sadalījums reģistros a = i + 2; b = a + 3; mov

Mainīgo sadalījums reģistros a = i + 2; b = a + 3; mov AX, I add AX, 2 mov a, AX mov AX, a // Lieks add AX, 3 mov b, AX

Invarianta koda iznešana unsigned char i, j, k, v, x; for (i = 0;

Invarianta koda iznešana unsigned char i, j, k, v, x; for (i = 0; i < v; i++) x = i * (j+k); T 1 = j + k; for(i = 0; i < v; i++) x = i * T 1;

Invarianta koda iznešana (turp. ) T 1 = j + k; for(i = 0;

Invarianta koda iznešana (turp. ) T 1 = j + k; for(i = 0; i < v; i++) x = i * T 1; T 1 = j + k; for(x = 0; x< T 1 * v; x += T 1) ; i = v;

Cikla indukcijas mainīga izslēgšana for(i=0; i<100; i++) ivector[i*2+3]=5; mov AX, 0 mov i, AX

Cikla indukcijas mainīga izslēgšana for(i=0; i<100; i++) ivector[i*2+3]=5; mov AX, 0 mov i, AX cmp AX, 100 jge L 134 L 11 B: mov BX, i shl BX, 1 mov ivector+6[BX], 5 inc i cmp i, 100 jl L 11 B L 134: mov i, 100 mov SI, OFFSET ivector+6 $L 20006: mov [SI], 5 add SI, 4 cmp SI, OFFSET ivector+406 jb $L 20006

“Ciklu saplūšana” for(i = 0; i < 10; i++) a = b + c;

“Ciklu saplūšana” for(i = 0; i < 10; i++) a = b + c; for(i = 0; i < 10; i++) d = e + f; for(i = 0; i < 10; i++) { a = b + c; d = e + f; }

“Ciklu izjaukšana” int a[3]; for(int i = 0; i < 3; i++) a[i] =

“Ciklu izjaukšana” int a[3]; for(int i = 0; i < 3; i++) a[i] = 0; mov i, 0 LOOP: mov BX, I shl BX, 1 mov a[BX], 0 inc i cmp i, 3 jl LOOP mov a, 0 mov a+2, 0 mov a+4, 0

“Ciklu izjaukšana” (turp. ) int a[10000]; for(int i = 0; i < 10000; i++)

“Ciklu izjaukšana” (turp. ) int a[10000]; for(int i = 0; i < 10000; i++) a[i] = 0; mov CX, 10000 mov i, CX sub AX, AX mov DI, offset a push DS pop ES cld rep stosw

Funkciju izsaukšanas optimizācija Enter un Leave instrukcijas n Parametru nodošana reģistros n Inline direktīvas

Funkciju izsaukšanas optimizācija Enter un Leave instrukcijas n Parametru nodošana reģistros n Inline direktīvas n

Negatīvas puses Kompilācijas laika palielināšana n “Atkļūdošanas” procesa sarežģīšanās n Potenciāls kļūdu avots n

Negatīvas puses Kompilācijas laika palielināšana n “Atkļūdošanas” procesa sarežģīšanās n Potenciāls kļūdu avots n