Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.353 Beiträge
 
Delphi 11 Alexandria
 
#29

AW: DLL mit FPC/Codetyphon erheblich kleiner als unter Delphi

  Alt 5. Mai 2016, 20:20
Ein weiterer wichtiger Punkt ist der generierte Code von FPC. Der ist einfach schlanker und direkter. Bei Delphi gibt es Tonnen von unnötigen Register saves und restores, die den Code langsam machen und die EXE/DLL aufblähen.
Ein konkretes Beispiel wäre schön. Wenn ich so den generierten Code vergleiche, kann ich davon nichts sehen. Ein einfaches Beispiel:
Delphi-Quellcode:
var
  a: string;
  b: Integer;
begin
  b := 42;
  a := IntToStr(b);
  ShowMessage(a);
end;
Delphi:
Code:
Unit93.pas.30: begin
00000000006B6B80 55               push rbp
00000000006B6B81 4883EC30         sub rsp,$30
00000000006B6B85 488BEC          mov rbp,rsp
00000000006B6B88 48C7452800000000 mov qword ptr [rbp+$28],$0000000000000000
00000000006B6B90 48894D40         mov [rbp+$40],rcx
00000000006B6B94 48895548         mov [rbp+$48],rdx
00000000006B6B98 90               nop
Unit93.pas.31: b := 42;
00000000006B6B99 C745242A000000   mov [rbp+$24],$0000002a
Unit93.pas.32: a := IntToStr(b);
00000000006B6BA0 488D4D28         lea rcx,[rbp+$28]
00000000006B6BA4 8B5524           mov edx,[rbp+$24]
00000000006B6BA7 E88493D7FF      call IntToStr
Unit93.pas.33: ShowMessage(a);
00000000006B6BAC 488B4D28         mov rcx,[rbp+$28]
00000000006B6BB0 E89B3BF3FF      call ShowMessage
00000000006B6BB5 90               nop
Unit93.pas.34: end;
00000000006B6BB6 488D4D28         lea rcx,[rbp+$28]
00000000006B6BBA E8217BD5FF      call @UStrClr
00000000006B6BBF 488D6530         lea rsp,[rbp+$30]
00000000006B6BC3 5D              pop rbp
00000000006B6BC4 C3               ret
Lazarus / FPC:
Code:
unit1.pas:37                              begin
000000010002C390 55                       push  %rbp
000000010002C391 4889e5                   mov   %rsp,%rbp
000000010002C394 488d6424c0               lea   -0x40(%rsp),%rsp
000000010002C399 48894df0                 mov   %rcx,-0x10(%rbp)
000000010002C39D 488955f8                 mov   %rdx,-0x8(%rbp)
000000010002C3A1 48c745e800000000         movq  $0x0,-0x18(%rbp)
000000010002C3A9 90                       nop
unit1.pas:38                              b := 42;
000000010002C3AA c745e02a000000           movl  $0x2a,-0x20(%rbp)
unit1.pas:39                              a := IntToStr(b);
000000010002C3B1 8b45e0                   mov   -0x20(%rbp),%eax
000000010002C3B4 488d4de8                 lea   -0x18(%rbp),%rcx
000000010002C3B8 89c2                     mov   %eax,%edx
000000010002C3BA e8c11a0200               callq 0x10004de80 <SYSUTILS_$$_INTTOSTR$LONGINT$$ANSISTRING>
unit1.pas:40                              ShowMessage(a);
000000010002C3BF 488b4de8                 mov   -0x18(%rbp),%rcx
000000010002C3C3 e828201100               callq 0x10013e3f0 <SHOWMESSAGE>
unit1.pas:37                              begin
000000010002C3C8 90                       nop
000000010002C3C9 4889e9                   mov   %rbp,%rcx
000000010002C3CC e89fffffff              callq 0x10002c370 <fin$0>
unit1.pas:41                              end;
000000010002C3D1 90                       nop
000000010002C3D2 488d6500                 lea   0x0(%rbp),%rsp
000000010002C3D6 5d                      pop   %rbp
000000010002C3D7 c3                       retq
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat