Internet logo

Az előző részben a Free Pascal fordító alapvető biztonsági beállításait vettük szemügyre. A mostani rész a programok optimalizálásával foglalkozik.

Mivel a Pascal elterjedtsége meg sem közelíti a C jellegű nyelvekét, mi elsősorban az üzemeltetési feladatok automatizálására használjuk. A gyakran ismétlődő vagy hosszadalmas feladatoknál jelentős szerepe van a sebességre való optimalizálásnak.

Az optimalizálás első kérdése, hogy mire optimalizálunk:

  • Sebességre
  • Memória használatra
  • Program méretre
  • Átláthatóságra

A program tervezésénél mindhárom szempontot figyelembe lehet venni, de sok esetben az optimalizálás – egy határon túl – a kiválasztott szempont szerinti teljesítményének növelését jelenti a többi rovására.

Az optimalizálást mindig a pontos feladatkírással és a megfelelő algoritmusok megválasztásával kell kezdeni.
A példaprogramunk egy egyszerű rendező algoritmus lesz, mivel azon az elmondottak jól bemutathatóak. A programok nem egy jól használható rendezőalgoritmus, hanem egy gondolatmenet bemutatására szolgálnak, ezért egy naiv algoritmust választunk,  mivel abban nagy fejlesztési potenciál van.

Program rendez;
Uses sysutils;
Const

meret=30000;

Var

tomb:array [1..meret] of real; //A rendezendő tömb
tmp:real;
i,j:integer; //Ciklusváltozók

begin
Randomize;
// A tömb feltöltése véletlen számokkal
For I:=1 to meret do
Begin
tomb[I]:=random;
End;
//A rendezés
Writeln (‘Kezd : ‘,TimeToStr(time));
For I:=meret downto 1 do
begin
For j:=1 to I-1 do
begin
If tomb[j]<tomb[j+1] then
Begin
tmp:=tomb[j];
tomb[j]:=tomb[j+1];
tomb[j+1]:=tmp;
end;
end;
end;

Writeln (‘Vege : ‘,TimeToStr(time));
end.

 

A program a legegyszerűbb buborékrendezést valósítja meg, mindenféle optimalizálás nélkül.

Ha a programot úgy módosítjuk, hogy kihasználjuk a már rendezett elemek adta lehetőségeket a program futási idejét várhatóan a felére csökkenthetjük, azonban a csökkenés mértéke függ a kiindulási rendezettségtől.

Program rendez2;
Uses sysutils;
Const

meret=32000;

Var
rendben:boolean;
tomb:array [1..meret] of double; //A rendezendő tömb
tmp:real;
i,j:integer; //Ciklusváltozók

begin
Randomize;
// A tömb feltöltése véletlen számokkal
For I:=1 to meret do
Begin
tomb[I]:=random;
End;
//A rendezés

Writeln (‘Kezd : ‘,TimeToStr(time));
For I:=meret-1 downto 1 do
begin
J:=I-1;
rendben:=false;
repeat
j:=j+1;
If (tomb[j]<tomb[j+1]) then
Begin
tmp:=tomb[j];
tomb[j]:=tomb[j+1];
tomb[j+1]:=tmp;
end
else
begin
rendben:=true;
end;
//    writeln (j);
until (j=meret);
end;
Writeln (‘Vege : ‘,TimeToStr(time));

end.

Természetesen vannak ennél (jelentősen) hatékonyabb megoldások is, azonban annak bemutatására, hogy józan gondolkodással egy program futási ideje töredékére csökkenthető megfelel.