210 likes | 464 Views
C valodas koda optimizācija. Dmitrijs Rutko. Saturs. Vēsture Attīstība Uzdevumi Optimizācijas līmeņi un stadijas Optimizācijas metodes. Attīstības virzieni. C standarti Kompilācijas laiks Koda pārnesamība Optimizācija. Kompilatoru uzdevumi. Koda translācija Optimizācija Izmērs
E N D
C valodas koda optimizācija Dmitrijs Rutko
Saturs • Vēsture • Attīstība • Uzdevumi • Optimizācijas līmeņi un stadijas • Optimizācijas metodes
Attīstības virzieni • C standarti • Kompilācijas laiks • Koda pārnesamība • Optimizācija
Kompilatoru uzdevumi • Koda translācija • Optimizācija • Izmērs • Ātrdarbība • Algoritma izvēle paliek galvenā
Optimizācija līmeņi • Operators • Bloks • Cikls • Procedūra • Programma
Optimizācijas stadijas • Izejas teksts -> starpforma • Platformas neatkarīga optimizācija • Platformas atkarīga optimizācija
x = y; if(a < x && b < x) c = x; x = y; if(a < y && b < y) c = y; “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 + 0; x = y * 0; x = y / 1.0; x = y / 0; // Kļūda “Konstantu savēršana” #define TWO 2 a = 1 + TWO; a = 3;
Kopējas izteiksmes if( a[y*3] < 0 || b[y*3] > 10) a[y*3] = 0; T1 = y*3; A1 = &a[T1]; A2 = &b[T1]; if( *A1 < 0 || *A2 > 10) *A1 = 0;
Kopējas izteiksmes (turp.) if(a == 0) a = y * 3; else b = y * 3; T1 = y * 3; if(a == 0) a = T1; else b = T1;
Kopējas izteiksmes (turp.) if((h3 + k3) < 0 ||(h3 + k3) > 5)printf(“...”); mov AX,h3mov AX,h3 add AX,k3add AX,k3 jl @18js L0187 mov AX,h3cmp AX,5 add AX,k3jle L0193 cmp AX,5L0187: jle @17mov AX,01.0000 @18:push AX mov AX,offset s@call printf push AXadd SP,2 call printfL0193: mov SP,BP @17:
Citas metodes • Stipruma samazināšana • Reizināšanas un dalīšanas aizvietošana ar nobīdes operāciju • Nesasniedzama koda izslēgšana #define DEBUG 0 if(DEBUG)printf("Debug Function\n"); • Lieku piešķiršanu izslēgšana a = 5; b = 0; a = b;
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 Mainīgo sadalījums reģistros
unsigned char i,j,k,v,x; for (i = 0; i < v; i++) x = i * (j+k); T1 = j + k; for(i = 0; i < v; i++) x = i * T1; Invarianta koda iznešana
T1 = j + k; for(i = 0; i < v; i++) x = i * T1; T1 = j + k; for(x = 0; x< T1 * v; x += T1) ; i = v; Invarianta koda iznešana (turp.)
for(i=0;i<100;i++)ivector[i*2+3]=5; Cikla indukcijas mainīga izslēgšana mov AX,0 mov i,AX cmp AX,100 jge L134 L11B: mov BX,i shl BX,1 shl BX,1 mov ivector+6[BX],5 inc i cmp i,100 jl L11B L134: mov i,100 mov SI,OFFSET ivector+6 $L20006: mov [SI],5 add SI,4 cmp SI,OFFSET ivector+406 jb $L20006
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 saplūšana”
int a[3]; for(int i = 0; i < 3; i++) a[i] = 0; “Ciklu izjaukšana” 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
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 “Ciklu izjaukšana” (turp.)
Funkciju izsaukšanas optimizācija • Enter un Leave instrukcijas • Parametru nodošana reģistros • Inline direktīvas
Negatīvas puses • Kompilācijas laika palielināšana • “Atkļūdošanas” procesa sarežģīšanās • Potenciāls kļūdu avots