Gradivo III razreda u Gimnaziji "Veljko Petrović"

Računarstvo i Informatika

Efikasnost programa - Optimizacija koda

Kako će izgledati kod programa, to zavisi od više faktora. Da li je bitno da se program izvršava brzo? Da li je kritična veličina memorije? Da li je program namenjen obuci ...

Uglavnom nije moguće napisati kod koji zadovoljava sve ove uslove. Ovde ćemo razmotriti slučajeve kada je potrebno obratiti pažnju na vreme ili memoriju.

Izbegavati deklarisanje veličina koje se ne koriste ili ne moraju koristiti u programu.

Var Stranica, povrsina, zapremina: real;
Begin
   ...
   Povrsina  := Stranica * Stranica * 6;
   Zapremina := Stranica * Stranica * Stranica;
   Writeln('Zapremina kocke je ' , Zapremina:10:2);
   Writeln('Površina kocke je ' , Stranica*Stranica*6:10:2);

- Promenljivu povrsina nismo uopste upotrebili.

- Promenljivu zapremina jesmo upotrebili, ali nismo morali. Mogli smo kao i za površinu direktno ispisati vrednost.

Izbegavati izračunavanje koje nije potrebno, odnosno ne duplirati izvršavanja.

Gornji kod ilustruje i ovu situaciju.

- Izraz Stranica * Stranica * 6 dva puta se izvršavao.

- Isti program smo mogli napisati sa dve naredbe dodele i dve promenljive manje. Naravno da bismo time smanjili razumljivost programa ali ponekad vreme i memorija diktiraju uslove.

Naredba dodele ili poziv procedure

i := i + 1;
inc(i);

Obe naredbe rade potpuno istu stvar. Prva se izvršava 1.19 puta brže, mereno na milijardu ciklusa.

i := a * a;
i := sqr(a);

Obe naredbe rade potpuno istu stvar. Prva se izvršava 5.31 puta brže.

i := (s >= 'A') OR (s <= 'Z');
i := s IN ['A'..'Z'];

Obe naredbe rade potpuno istu stvar. Prva se izvršava 1.077 puta brže.

i := s[1] = 'A';
i := copy(s, 1, 1) = 'A';

Obe naredbe rade potpuno istu stvar. Prva se izvršava 12.045 puta brže.

{1}
var niz : array[1..100] of integer;
...
   For i := 1 TO 100 DO niz[i] := i + 100;
{2}
var niz : array[101..200] of integer;
...
   For i := 101 TO 200 DO niz[i] := i;

Oba koda rade potpuno istu stvar. Pune niz od 100 elemenata brojevima oid 101 do 200. Prva se izvršava 1.05 puta sporije. Razlog je izračunavanje izraza u ciklusu. u prvom slučaju.

Upotreba procedura Continue i Break.

Korišćenjem ovih procedura moguće je izbeći nepotrebno izvršavanje pojedinih naredbi odnosno čitavih ponavljanja bloka naredbi.

Od 1984. g. (od kad programiram u PASCAL-u), nikada nisam koristio ni jednu od ove dve procedure niti labele. Pravilnim izborom uslova završetka ciklusa, odnosno tela ciklusa, to je moguće izvesti. U WHILE-DO i REPEAT-UNTIL ciklusima gotovo sigurno. U FOR-TO-DO ciklusima, procedura Break ima smisla u situacijama kada nešto tražimo u strukturama sa poznatim brojem članova, i kada ga nadjemo, nema potrebe tražiti dalje. Naravno, ako niste verzirani, tada koristite ove procedure kada vidite da mogu doneti uštedu u vremenu.

Superiornost algoritma.

Koji algoritam upotrebiti, zavisi od znanja, iskustva, trenutne inspiracije, ....

Kodovi sva četiriprimera rade potpuno istu stvar. Kreiraju jediničnu matricu 100x100.

var niz : array[1..100, 1..100] of integer;
Begin
{1: (i div j) puta (j div i) je 1 samo kad si i i j jednaki}
   For i := 1 TO 100 DO          
     For j := 1 TO 100 DO
       niz[i, j] := i div j * (j div i);
{2: kad su i i j jednaki upisujemo jedinicu, inače upisujemo nulu}
   For i := 1 TO 100 DO
     For j := 1 TO 100 DO
       if i = j
          then niz[i, j] := 1
          else niz[i, j] := 0;

Ovo je redak primer kada efikasnost i razumljivost nisu obrnuto recipročne. Drugi primer se izvršava 20 puta brže, mada se možda na prvi pogled ne čini tako.

{3: prvo praznimo matricu a onda upisujemo jedinicu po dijagonali}
   For i := 1 TO 100 DO
     For j := 1 TO 100 DO
       niz[i, j] := 0;
   For j := 1 TO 100 DO
     niz[j, j] := 1;

Treći primer je još efikasniji i izvršava se 1.24 puta brže od drugog.

{4: prvo praznimo matricu a onda upisujemo jedinicu po dijagonali}
   FillChar(niz, SizeOf(niz), 0);
   For j := 1 TO 100 DO
     niz[j, j] := 1;

Četvrti primer je najefikasniji. On se izvršava 12.06 puta brže nego treći.

Superiornost algoritma je naročito izražena kod algoritama za pretraživanje i sortiranje.

Valid XHTML 1.0 Strict! | Site map | Kontakt | © 2007..2015 prof. Duško Obradović sa učenicima Gimnazije