A processzor sebessége mennyire van hatással arra, hogy egy kód miként fut le rajta? (bővebben lent)
Gondolom, hogy ebben az esetben (amit mutatni fogok példaként - köszönet SimkoL megoldásáért - ) a magok száma nincs hatással a futási időre, csak a processzor órajele, vagy tévedek?
Például ez a kód i7 processzoron (vagy nagyobb teljesítményűn) hány mp alatt futna le?
Függ attól is, hogy eljárásokra, függvényekre van -e bontva a feladat (mert akkor azokat örökösen hívogatni kell, gondolom ez is idő?)
C nyelven gyorsabban futna az adott kód, vagy mennyire függ ez programozási nyelvtől? Szinte havonta adják ki az újabb és újabb C fordítókat, gondolom hogy processzor-optimalizálást is végeznek ilyenkor?
Én csak Pascal-hoz értek, optimalizálás nélkül 14, optimalizálással 11 mp alatt futott le a kód...
{$OPTIMIZATION REGVAR,LEVEL3}
program project1;
{$mode objfpc}{$H+}
uses {$IFDEF UNIX} {$IFDEF UseCThreads} cthreads, {$ENDIF} {$ENDIF} Classes,sysutils,dateutils;
type
TSS = (start,stop);
var
p: array[1 .. 12] of integer;
is_last: boolean;
n, lepes : longint;
{A későbbi tömbméret változtatás megkönnyítése érdekében a feltöltésnél
és a kiirásnál a Low illetve a High függvényeket használjuk a tömb alsó
és felső indexének eléréséhez}
{Feltölti a p tömböt az alsó és felső indexnek megfelelő értékekkel}
procedure Feltolt;
var i: byte;
begin
for i := Low(p) to High(p) do p[i] := i;
end;
{A paraméterként kapott két értéket megcseréli}
{ procedure Swap(var int_a, int_b: integer);
var int_c: integer;
begin
int_c := int_a;
int_a := int_b;
int_b := int_c;
end;}
{Kiírja a p tömb értékeit}
procedure Kiir;
var i: integer;
begin
for i := Low(p) to High(p) do Write(p[i], ' ');
{ Write(' ', lepes, '. variáció');}
WriteLn;
end;
procedure Next;
var j, m: longint;
c:longint;
begin
is_last := True;
j := n - 1;
{Jobbról megkeressük az első elemet, ami kisebb a nála jobbra állónál.
Ha van ilyen akkor az is_last logikai változót Hamisra állítjuk, jelezve
ezzel, hogy a tömb még nincs csökkenő sorrendbe rendezve, ugyanis ez a
módszer a növekvő jellegű tömbökre érvényes}
while (j > 0) do
begin
if p[j] < p[j + 1] then
begin
is_last := False;
{Ha találtunk a feltételnek megfelelőt kilépünk a ciklusból}
Break;
end;
Dec(j);
end;
{Ha a tömbünk még nincs tökéletes csökkenő formába rendezve, ami az
is_lastváltozó jelez akkor...}
if not is_last then
begin
{Növeljük a variációk számát jelző változót}
Inc(lepes);
{Jobbról megkeressük az első elemet, ami nagyobb, mint az előbb
kiválasztott j indexű elem}
m := n;
while m > j do
begin
{Ha találtunk a feltételnek megfelelőt kilépünk a ciklusból}
if p[m] > p[j] then Break;
Dec(m);
end;
{Megcseréljük a kettőt}
{ Swap(p[m], p[j]);}
c:=p[m];
p[m]:=p[j];
p[j]:=c;
{Megfordítjuk a (j+1)-től a sorozat végéig tartó szakaszt}
m := n;
Inc(j);
while j < m do
begin
{ Swap(p[j], p[m]);}
c:=p[j];
p[j]:=p[m];
p[m]:=c;
Inc(j);
Dec(m);
end;
end;
end;
procedure idomero(ss : TSS; ido : TDateTime);
const StartTime : TDateTime=0;
var dt : integer;
begin
case ss of
start: begin
starttime := ido;
Write('Start...');
end;
stop: begin
dt := MilliSecondsBetween(Ido, StartTime);
Write('Stop ,',dt/1000:7:4,' mp -');
end;
end;
end;
begin
idomero(start,time);
lepes := 1;
Feltolt; {Feltöltjük a p tömböt}
n := Length(p); {n := a p tömb mérete}
{Addig fut a ciklus, amíg a tömb még nincs csökkenő sorrendbe rendezve}
while not is_last do
begin
{ Kiir;}
Next;
end;
{ ReadLn;}
idomero(stop,time);
end.
A futási sebesség függ az órajeltől, az operációs rendszertől, a futó feladatoktól, a memóriahasználattól, optimalizálástól, sőt, akár a HDD sebességétől is, ha onnan is kell anyagot beolvasni.
A CPU magok száma akkor számít, ha az alkalmazás több szálon fut - akkor minden szál a fenti adatoknak megfelelően fut.
Jól megírt és kioptimalizált program esetén a futási időben nem lesz különbség (jelentős). Managed nyelveknél igen, mivel ott a keretrendszer és a virtuális gép elvesz némi időt (java, és az összes .net-es nyelv), de az esetek legnagyobb részében ez az idő sem jelentős (vagy, észrevehető jól megírt program esetében).
A te kódod esetében a legtöbb időt szerintem a töménytelen tömbön végigfutó FOR veszi el - az optimalizálás pedig valószínűleg pár futást kivesz a programból, ezért lesz gyorsabb. DE ezek más nyelven sem lesznek sokkal gyorsabbak, hiszen itt sok körítés nem igazán van.
Köszönöm a választ.
A RAM sebessége mennyire van hatással a futó programra (DDR 2 vagy 3 vagy 4 és órajele)? (gondolom hogy modern oprendszerek a kiterjesztett memóriába helyezik át az ilyen futó programokat és nem az alap 640 KB memóriában fut - nem is tudom hogy azt egyáltalán mi használja. :-)
Egyébként valamikor próbáltam a SHA1 algoritmust Pascal-ban, na ott azt hiszem tényleg nem volt különbség az optimalizált és nem optimalizált közt, gondolom annyian és úgy írták a kódot, hogy az egy letisztult algoritmus, mivel matematikusok írták és fontos volt, hogy minden eszközön a lehető leggyorsabb legyen...
Az általam bemásolt kód egy új, modern gépen mennyivel gyorsabban futna, mint nálam? Ez egy nagyon régi laptop, benne:
Amd Athlon (tm) II P320 Dual-Core Processor
Annyival gyorsabban amennyivel.
Nem lehet megmondani.
De általában ha egy kód lassú az nem a számítógépen, hanem a rosszul megírt kódon múlik.
C++: data . hu/get/9033718/ConsoleApplication1.exe
De szerintem sem fog gyorsabban futni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!