A programozáshoz mennyire kell matek?
k := 56;
k := (K div 2);
push ebp
mov ebp,esp
mov word [U_$P$PROGRAM_$$_K],56
movsx eax,word [U_$P$PROGRAM_$$_K]
mov edx,eax
shr edx,31
add eax,edx
sar eax,1
mov word [U_$P$PROGRAM_$$_K],ax
call fpc_do_exit
mov esp,ebp
pop ebp
ret
-------------
K := 56;
K := K >> 1;
push ebp
mov ebp,esp
mov word [U_$P$PROGRAM_$$_K],56
movsx eax,word [U_$P$PROGRAM_$$_K]
shr eax,1
mov word [U_$P$PROGRAM_$$_K],ax
call fpc_do_exit
mov esp,ebp
pop ebp
ret
Jól látható, hogy a fordító eloptimalizálta a szorzást. Kicserélte a hatékonyabb SHR-re, de még így is rövidebb a SHIFT-es (ez az alsó) megoldás.
fpc -O- -ANasm forditando.pas
Az első paraméter az optimalizációs szint. Ez a - jellel nulla.
A második paraméter az -A ami assembly kimenetet generál, ez után azt kell megadni, hogy milyen assembly forrást köpjön ki a fordító. A Nasm a Netwide assemblere, amúgy alapban AT&T lesz, legalábbis, ha jól emlékszem.
A fordító opcióit elolvashatod így:
fpc -h > kimenet.txt
Ez generál egy kimenet.txt nevű file-t amiben ott lesz minden fordítási direktíva, amit használni lehet, egy sornyi rövid magyarázattal.
Elég sokat tud az FP fordítója, ezt jelzi az is, hogy az instant helpje is több mint 16 kB.
Az időmérésed azért nem jó, mert a processz saját ideje kell, nem az eltelt idő. Utóbbiban benne van az összes futó program által elhasznált idő. A win is a linux is multitaszt opre, ez azt jelenti, hogy egy időben fut sok processz és az ütemező másodpercenként (!) 50-100 alkalommal osztja ki az időszeleteket, tehát az eltelt idő neked nem lesz jó.
De ilyen dolognél nem is kell időt mérni, pláne úgy nem ,ahogy tetted, elég a generált asm listából kinézni az alkalmazott utasításokat és a táblázatból kinézni a hozzájuk rendelt ciklust. Az SHR/SHL amúgy fél ciklus, a "rendes" osztás meg attól függ, hogy mit osztasz mivel, lehet akár 150 ciklus is, tehát szélsőséges esetben akár 300-szor (de legalább 80-szor) gyorsabb lehet a bit shiftelés a valódi osztásnál.
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!