C valodas koda optimizācija
description
Transcript of C valodas koda optimizācija
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
“Konstanšu / kopiju vairošana”
x = y;if(a < x && b < x) c
= x;
x = y;if(a < y && b < y) c
= y;
x = 2;if( a < x && b < x) c
= x;
x = 2;if(a < 2 && b < 2) c
= 2;
“Konstantu savēršana”
x = y + 0;x = y * 0;x = y / 1.0;x = y / 0; // Kļūda
#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;
elseb = 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,h3 mov AX,h3 add AX,k3 add AX,k3 jl @18 js L0187 mov AX,h3 cmp AX,5 add AX,k3 jle L0193 cmp AX,5 L0187: jle @17 mov AX,01.0000
@18: push AX mov AX,offset s@ call printf push AX add SP,2 call printf L0193: 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 0if(DEBUG) printf("Debug Function\n");
Lieku piešķiršanu izslēgšanaa = 5; b = 0; a = b;
Mainīgo sadalījums reģistros
a = i + 2;
b = a + 3; mov AX,Iadd AX,2mov a,AXmov AX,a // Lieksadd AX,3mov b,AX
Invarianta koda iznešana
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 (turp.)
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;
Cikla indukcijas mainīga izslēgšana
for(i=0;i<100;i++) ivector[i*2+3]=5;
mov i,100
mov SI,OFFSET ivector+6
$L20006:
mov [SI],5
add SI,4
cmp SI,OFFSET ivector+406
jb $L20006
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:
“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] = 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++)
a[i] = 0;
mov CX,10000mov i,CXsub AX,AXmov DI,offset apush DSpop EScldrep stosw
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