c valodas koda optimizācija

21
C valodas koda optimizācija Dmitrijs Rutko

Upload: alban

Post on 10-Jan-2016

83 views

Category:

Documents


7 download

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: C valodas koda optimizācija

C valodas koda optimizācija

Dmitrijs Rutko

Page 2: C valodas koda optimizācija

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

Page 3: C valodas koda optimizācija

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

Page 4: C valodas koda optimizācija

Kompilatoru uzdevumi Koda translācija Optimizācija

Izmērs Ātrdarbība

Algoritma izvēle paliek galvenā

Page 5: C valodas koda optimizācija

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

Page 6: C valodas koda optimizācija

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

Page 7: C valodas koda 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;

Page 8: C valodas koda optimizācija

“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;

Page 9: C valodas koda optimizācija

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;

Page 10: C valodas koda optimizācija

Kopējas izteiksmes (turp.)

if(a == 0)a = y * 3;

elseb = y * 3;

T1 = y * 3;if(a == 0)

a = T1;else

b = T1;

Page 11: C valodas koda optimizācija

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:

Page 12: C valodas koda optimizācija

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;

Page 13: C valodas koda optimizācija

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

Page 14: C valodas koda optimizācija

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;

Page 15: C valodas koda optimizācija

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;

Page 16: C valodas koda optimizācija

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:

Page 17: C valodas koda optimizācija

“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; }

Page 18: C valodas koda optimizācija

“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

Page 19: C valodas koda optimizācija

“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

Page 20: C valodas koda optimizācija

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

Page 21: C valodas koda optimizācija

Negatīvas puses Kompilācijas laika palielināšana “Atkļūdošanas” procesa

sarežģīšanās Potenciāls kļūdu avots