Az előző részben a Free Pascal fordító alapvető biztonsági beállításait vettük szemügyre. Ez a 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.