c valodas koda optimizācija

Post on 10-Jan-2016

84 Views

Category:

Documents

7 Downloads

Preview:

Click to see full reader

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

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

top related