Kategória: Free Pascal

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.

Az oldal használatával elfogadja, hogy az sütiket használ További információ

A sütik használatát érdemes engedélyezni a böngészőben.
The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Bezár