Kezdőoldal » Számítástechnika » Programozás » Pascal: eljárásoknál "inline"-...

Pascal: eljárásoknál "inline"-t alkalmazva eljáráshívás nem gyorsul, miért?

Figyelt kérdés

Fordítói kapcsolót alkalmazom:

{$inline on}

eljárásnév után: inline;

a programban az eljáráshívás nem gyorsul, egy hangyányit se, miért?

Ha a ciklusba írom ami az eljárásban hívom akkor 4x gyorsabb... Rendezésnél csere pl.

Az érdekelne miként lehet megoldani hogy eljáráshívás felgyorsuljon.



2016. okt. 12. 21:07
 1/5 A kérdező kommentje:

Itt a kód.

Nem az érdekelne, miként lehetne a rendezési algoritmust felgyorsítani, hanem az, miként lehetne megoldani a gyorsabb eljáráshívást, amelyet minden programnál tudnék alkalmazni, mert látszólag ez a probléma.

Ha bemásolom a cserét a két ciklusba (és nem eljárásból hívogatom) akkor villámgyors sebességnövekedés tapasztalható...

azt szeretném ha eljárásban is ilyen gyorsan lehetne hívogatni.


{$OPTIMIZATION REGVAR,LEVEL3} {$inline on}

{$MODE FPC} {$H+}


uses SysUtils;

const

meddig = 120000;


var

t : array [1..meddig] of longint;

i, j, cs : longint;

dt,dt2 : TDateTime;


procedure csere;inline;

begin

cs:=t[i];

t[i]:=t[j];

t[j]:=cs;

end;


begin

randomize;

for i:= 1 to meddig do

t[i] := random (MaxLongint);

WriteLn('csere kovetkezik');

dt := now;

for i := 1 to meddig -1 do

begin

for j := i+1 to meddig do

begin

if t[i]<t[j] then

csere;

end;

end;

dt2 := now;

WriteLn('Eltelt ido: ',(DT2-DT)*24*3600:0:2,' sec');

ReadLn;

end.

2016. okt. 12. 21:25
 2/5 SimkoL ***** válasza:

Hát akkor valamit nagyon elbaba. Itt az eredmény egy lassú, P4 HT 3 GHz gépen futtatva, a módok Fpc, ObjFpc és Delphi - ezek igazából nem befolyásolnak semmit esetünkben -. A feladat 1..75000 csökkenő sorrendbe rendezése - a random teszt helytelen, mert nem ugyanazt a feladatot kapja meg a program -

[link]

2016. okt. 13. 08:38
Hasznos számodra ez a válasz?
 3/5 A kérdező kommentje:

Valóban. :-)

Nagyobb elemszám esetén mutatkozik csak különbség, beírtam neki konstansnak:

5*75000

Az eljáráshívás nélküli lefutott kb. 140 mp alatt, a másikat még mindig várom már vagy 5 perce. :S

Hopsz megérkezett, 582 másodperc alatt futott le.

2016. okt. 13. 12:40
 4/5 SimkoL ***** válasza:

Hát nem nagyon tudom miket fordítsz. Kód:


program inlin_fpc;


{$OPTIMIZATION REGVAR,LEVEL3}

{$INLINE ON}

{$MODE Fpc}

{$H+}


uses SysUtils;


const meddig = 200000;


var

t: array [1..meddig] of Longint;

i, j, cs: Longint;

dt, dt2: TDateTime;


procedure csere; inline;

begin

cs := t[i];

t[i] := t[j];

t[j] := cs;

end;


procedure csere1;

begin

cs := t[i];

t[i] := t[j];

t[j] := cs;

end;


begin

for i := 1 to meddig do t[i] := i;

WriteLn('Csere kovetkezik - inline -');

dt := now;

for i := 1 to meddig - 1 do

for j := i + 1 to meddig do

if t[i] < t[j] then csere;

dt2 := Now;

WriteLn('Eltelt ido: ', (dt2 - dt) * 24 * 3600: 0: 2, ' sec');

for i := 1 to meddig do t[i] := i;

WriteLn('Csere kovetkezik - inline nelkul -');

dt := Now;

for i := 1 to meddig - 1 do

for j := i + 1 to meddig do

if t[i] < t[j] then csere1;

dt2 := Now;

WriteLn('Eltelt ido: ', (dt2 - dt) * 24 * 3600: 0: 2, ' sec');

for i := 1 to meddig do t[i] := i;

WriteLn('Csere kovetkezik - beepitve -');

dt := Now;

for i := 1 to meddig - 1 do

for j := i + 1 to meddig do

if t[i] < t[j] then

begin

cs := t[i];

t[i] := t[j];

t[j] := cs;

end;

dt2 := Now;

WriteLn('Eltelt ido: ', (dt2 - dt) * 24 * 3600: 0: 2, ' sec');

ReadLn;

end.


Eredmény: [link] a fentebb említett gépen.

2016. okt. 13. 17:05
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:

Én a következőképp csináltam:

két programot gyártottam, egyiket a {$inline on} kapcsoló bekapcsolásával és az eljárás utáni inline; parancs beírásával fordítottam, másikat pedig simán.

Inline esetén tényleg gyakorlatilag egyazon idő alatt fut le az eljárás és a beágyazott utasítás is.

A "nem inline" program esetén pedig látni lehet, hogy a beágyazott utasítás mennyivel gyorsabban lefut mint a másik esetén tehát az inline az eljárást tényleg gyorsította, de ezzel együtt bizonyos lassulást is okozott.

Ez miért lehet?

2016. okt. 16. 10:03

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!