Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Langsamer mit Optimierung?


Spaceguide - Do 08.12.05 12:42
Titel: Langsamer mit Optimierung?
Hi, habe gerade was ausprobiert und da ist mir folgendes aufgefallen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure Bla(i: integer);
{$O-}
 var j : integer;
begin
  j := i;
end;
{$O+}


Diese Prozedur wird doppelt so schnell, wenn man die Optimierung ausschaltet.

Bei Optimierung werden diese Zeilen weggekürzt:

mov eax,[ebp-$04]
mov [ebp-$08],eax

Warum wird das dann langsamer?


delfiphan - Do 08.12.05 13:42

Bei mir ist die optimierte Variante 52% schneller (D7).


opfer.der.genauigkeit - Do 08.12.05 13:45

Hi,
welche Delphiversion verwendest du?


Spaceguide - Do 08.12.05 14:50

Ich benutze auch D7. Vielleicht liegts an der CPU (hier Athlon MP)?


Horst_H - Do 08.12.05 15:37

Hallo,

bei so kurzen Code-abschnitten spielt zuviel eine Rolle.
Welchen Zustand hatten die Register vor dem Aufruf, kommt die Cpu besser damit zurecht, wenn zwischendurch irgendwas sinnloses passiert um mit dem out-of-order und Registerrenaming fertig zu werden. liegen die Adressen fuer den Code und die Daten guenstiger.
Bei meinem Ahtlon64 939 ist das sortieren von 8-Byte grossen Felder teilweise schneller als mit 4 Byte , mancher Code wird schneller wenn zwischendrin einfach was nutzloses steht nur um zeit fuer die laufende Verarbeitung zu gewinnen, damit die anschliessende Arbeit nicht mehr stockt.
Bei einem Programm mit der Fpu kam ich bis auf doppelte Taktrate bei der Bestimmung des unnormalisierten Normalenvektors (40 Befehle 20 Takte) FPU und CPU Befehle gut gemischt.
Athlon reagiert auch pingelig auf Sprungadressen alignment.
lies mal 22007.pdf von AMD

Gruss Horst


delfiphan - Do 08.12.05 18:34

Hi, meine 52%-Messung stammt natürlich nicht von einem einmaligen Ausführen; das ist ein Mittelwert aus einigen Milliarden Durchläufen. Für beide Funktionen habe ich soweit möglich die gleiche Bedingung geschafft.


Spaceguide - Do 08.12.05 19:14

Baue ich bei der optimierten Variante ein


Delphi-Quelltext
1:
2:
3:
asm
 nop
end;


ein, so ist es 3 mal so schnell wie ohne :-/. Ich glaube der Delphi-Compiler mag keine Athlons (die Effekte habe ich auf meinem Centrino nicht).


Horst_H - Do 08.12.05 19:32

Hallo,

das kann man wohl sagen.
Bei Fastcode project gibt es auch eine Tabelle ueber die rel. Laufzeitunterschiede.
http://dennishomepage.gugs-cats.dk/BranchTargetAlignInvest.htm
Nur mal die Durchschnittswerte bei CharPos sind es 40% jenachdem wo der Code steht, da sieht der P4 schon viel besser aus,auch wenn wenn bei den Projekten oft der Athlon weit bis ganz vorne ist

Quelltext
1:
2:
3:
4:
5:
6:
7:
      Average
P3      21,4
P4       5,1
P4E      5,7
XP      22,2
Opteron 25,4
PM B    13,8


Gruss Horst