hier mein Test mit Windows 10 (i3-9100):
Pascal = 7750 ms
Assembler = 7266 ms
Pascal = 7750 ms
Assembler = 7266 ms
Ich habe den Code etwas abgeändert, damit das Resultat auch verwendet wird und nichts wegoptimiert wird.
Lazarus 2.3.0 (rev main-2_3-2199-g898f4009c0) FPC 3.2.2 x86_64-linux-gtk2Func: 8658ms 192046823006208
Asm: 7721ms 192046823006208
MinMax: 5056ms 192046823006208
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
a, b, Start, Stopp: Integer;
c:Int64;
begin
c:=0;
Start := GetTickCount64;
for a := 0 to $FFFF do
for b := 0 to $FFFF do
c:=c+CalcPascal(a, b);
Stopp := GetTickCount64;
Memo1.Lines.Add('Func: '+IntToStr(Stopp - Start)+'ms '+c.ToString);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
a, b, Start, Stopp: Integer;
c:Int64;
begin
c:=0;
Start := GetTickCount64;
for a := 0 to $FFFF do
for b := 0 to $FFFF do
c:=c+CalcAssembler(a, b);
Stopp := GetTickCount64;
Memo1.Lines.Add('Asm: '+IntToStr(Stopp - Start)+'ms '+c.ToString);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
a, b, Start, Stopp: Integer;
c:Int64;
begin
c:=0;
Start := GetTickCount64;
for a := 0 to $FFFF do
for b := 0 to $FFFF do
c:=c+Min(Max(a+b-$3FFF,0),$FFFF);
Stopp := GetTickCount64;
Memo1.Lines.Add('MinMax: '+IntToStr(Stopp - Start)+'ms '+c.ToString);
end;
Code: Alles auswählen
k:=EnsureRange(i+j-$40,0,$FF);
Code: Alles auswählen
Pascal : 26344ms
Assembler : 26828ms
MinMax als Unterprogramm : 24844ms
MinMax direkt als Code : 15969ms
Fairerweise muss man sagen, dass Math.Max etc. syntaktisch auch Funktionsaufrufe sind.Ally hat geschrieben: Di 15. Nov 2022, 15:56 es macht einen ordentlichen Unterschied ob man die Function CalcPascal aufruft oder den Functionscode direkt ausführt.
Code: Alles auswählen
function CalcPascal(a, b: Integer): Integer; inline;
begin
a := a + b - $3FFF;
if a < 0 then
Exit(0);
if a > $FFFF then
Exit($FFFF);
Result := a;
end;
Ja hatte ich, nach siro's Stichwort, gerade ausprobiert.Mach mal so und staune!
Hier geht es um Assembler Code, der ist platformspezifisch. Dann machst eben folgendes draus:fliegermichl hat geschrieben: Di 15. Nov 2022, 09:36 Das kompiliert natürlich wieder nicht auf 32 Bit Targets.
Code: Alles auswählen
{$if defined(cpux86_64)}
{ hier der x86_64 Assembly Code }
{$elseif defined(cpu386)}
{ hier der i386 Assembly Code }
{$else}
{ hier das Pascal Only Fallback }
{$endif}