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   : 15969msFairerweise 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}