Witam,
wgłębiając się w Pascala postanowiłem popróbować ze wstawkami ASM. Z czystej ciekawości napisałem 3 funkcje:
function GetTime:Integer;
var
SystemTime: TSystemTime;
begin
GetLocalTime(SystemTime);
with SystemTime do
Result :=(wSecond*1000)+ wMilliseconds;
end;
function AsmTime(Repeats:Integer):Integer; assembler
var
From:Integer;
asm
PUSH EBX
MOV EBX,0
PUSH EAX
CALL GetTime
MOV From,EAX
POP EAX
@JUMP:
CMP EAX,EBX
JZ @END
INC EBX
JMP @JUMP
@END:
CALL GetTime
SUB EAX,From
POP EBX
end;
function PascalTime(Repeats:Integer):Integer;
var
Now,I:Integer;
begin
Now:=GetTime;
I:=0;
repeat
Result:=11;
Inc(I);
until(I=Repeats);
Result:=GetTime-Now;
end;
Mają one zwrócić ile czasu potrzebowały na wykonanie kodu. Spodziewałem się, że funkcja AsmTime będzie o wiele szybsza, a przynajmniej szybsza, a tu zaskoczenie. Potrzebuje ona średnio 2x więcej czasu na wykonanie kodu, niż funkcja PascalTime. Fakt, assembler w moim wypadku to początki, początków.
Dla przykładu na mojej maszynie:
const
Too=999999999;
begin
WriteLn('ASM:'#9#9,AsmTime(Too),' ms');
WriteLn('Pascal:'#9#9,PascalTime(Too),' ms');
Wynosi:
ASM: 1061 ms
Pascal: 504 ms
Skąd ten zaskakujący wynik?