AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
Thema durchsuchen
Ansicht
Themen-Optionen

Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

Ein Thema von KodeZwerg · begonnen am 19. Apr 2018 · letzter Beitrag vom 19. Apr 2018
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

  Alt 19. Apr 2018, 17:38
Hallo, tut mir leid wegen Titel, mir fiel kein besserer ein.

Hier ein für mich noch nicht erklärbares Phänomen.
Ich lasse 500tausend mal was machen um Zeit zu messen wie lange es braucht.
Nachdem ich festgestellt habe das STR langsamer ist habe ich in der Funktion alles deaktiviert.
Programm ausführen lassen und mich wundert das Ergebniss (siehe Bild).
Wie kann etwas das nichts macht mehr Zeit kosten als etwas das was macht?


Delphi-Quellcode:
function EuroToCt (const Euro: Extended) : Int64;
var
 tmp : String;
begin
// Str(euro*100:8:0,tmp);
// Result := StrToInt(tmp);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  Ticks1, Ticks2 : UInt64;
  c: Int64;
  a: Double;
begin
 a := 1.71;
 Memo1.Clear;
 Ticks1 := GetTicks;
 for I := 0 to 500000 do c := Round(a*100);
 Ticks1 := GetTicks - Ticks1;
 Ticks2 := GetTicks;
 for I := 0 to 500000 do c := EuroToCt(a);
 Ticks2 := GetTicks - Ticks2;
 Memo1.Lines.Add(IntToStr(Ticks1)+' ROUND');
 Memo1.Lines.Add(IntToStr(Ticks2)+' STR');
end;
Miniaturansicht angehängter Grafiken
mybug.jpg  
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

  Alt 19. Apr 2018, 17:44
Hallo,

Delphi-Quellcode:
a := 1.71;
 for I := 0 to 500000 do c := Round(a*100);
Ich denke, das a*100 optimiert der Compiler.

Das hier vielleicht nicht.
Delphi-Quellcode:
or I := 0 to 500000 do
begin
 a := 1.71;
 c := Round(a*100);
Hast Du denn die Optimierung in der IDE eingeschaltet?
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

  Alt 19. Apr 2018, 17:45
Round wird möglicherweise inline ausgeführt, es entfallen so die Funktionsaufrufe.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

  Alt 19. Apr 2018, 18:00
Wie kann etwas das nichts macht mehr Zeit kosten als etwas das was macht?
Weil die Funktion leider doch etwas macht Der String temp sorgt dafür, dass eine ganze Reihe an Operationen ausgeführt werden. Außerdem hast du Overhead durch das Stack-Frame, den CALL ansich, etc. Leider ist der Delphi Compiler sogar im Release mode so "dumm", dass er diese Anweisungen nicht raus-optimiert.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

  Alt 19. Apr 2018, 18:02
Der String temp sorgt dafür, dass eine ganze Reihe an Operationen ausgeführt werden. Außerdem hast du Overhead durch das Stack-Frame, den CALL ansich, etc. Leider ist der Delphi Compiler sogar im Release mode so "dumm", dass er diese Anweisungen nicht raus-optimiert.
Selbst ohne den macht er noch stack gejuggle, was aber daran liegt dass für das Int64 Result platz auf dem Stack geschaffen wird, um am Ende in eax und edx zu packen.
Außerdem macht der Delphi Compiler keine gängigen Peephole Optimizations um unnötige vor/zurück Operationen zu eliminieren.

Kann man sehen, wenn man mal spaßeshalber auf Integer ändert (einfacheres assembly zum erklären):

Code:
Project1.dpr.15: begin
004CE91C 55               push ebp
004CE91D 8BEC            mov ebp,esp
Project1.dpr.18: end;
004CE91F 5D              pop ebp
004CE920 C20C00           ret $000c
1. ebp Register auf dem Stack sichern, weil
2. Wert aus esp in ebp gepackt wird, aber
3. Wert vom Stack wieder in ebp geholt wird
4. Funktion verlassen

Also effektiv ist nix passiert (und ja, das ist mit $O+,W- kompiliert).
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (19. Apr 2018 um 18:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#6

AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

  Alt 19. Apr 2018, 18:08
Weil die Funktion leider doch etwas macht Der String temp sorgt dafür, dass eine ganze Reihe an Operationen ausgeführt werden. Außerdem hast du Overhead durch das Stack-Frame, den CALL ansich, etc. Leider ist der Delphi Compiler sogar im Release mode so "dumm", dass er diese Anweisungen nicht raus-optimiert.
Der String sollte immer rausfliegen, egal ob Debug oder Release.

Und nein, die leere Funktion darf der Compiler eigenmächtig garnicht rauswerfen.
Woher soll er wissen, ob diese Funktion nicht eventuell gehookt wird und dann dort doch etwas gemacht wird?

Zitat:
Der String temp sorgt dafür
Temp fliet weg, da nicht verwendet, aber ob Stackframe und Co. aufgeräumt werden, weil dann doch keine Variable vor kam ... k.A.

Bei String und Dergleichen kommt vom Compiler auch noch ein Try-Finally um die ganze Funktion, damit diese Variablen immer ordnungsgemäß aufgeräumt werden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Apr 2018 um 18:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

  Alt 19. Apr 2018, 18:20
Jupp, die [Var tmp:String] hat schuld, habs gerade getestet, nun beide annähernd gleich schnell.
Zur Frage wegen Compiler Optionen, die waren so wie Emba das voreingestellt hat für neue VCL Projekte, es stand auf Release.
Danke für die Aufklärung!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!

  Alt 19. Apr 2018, 19:11
Weil die Funktion leider doch etwas macht Der String temp sorgt dafür, dass eine ganze Reihe an Operationen ausgeführt werden. Außerdem hast du Overhead durch das Stack-Frame, den CALL ansich, etc. Leider ist der Delphi Compiler sogar im Release mode so "dumm", dass er diese Anweisungen nicht raus-optimiert.
Der String sollte immer rausfliegen, egal ob Debug oder Release.
Tut er aber leider nicht. Bzw. bleibt der SEH und noch einiges an sonstigem Kram zurück, der definitiv unnötig ist an dieser Stelle.

Und nein, die leere Funktion darf der Compiler eigenmächtig garnicht rauswerfen.
Woher soll er wissen, ob diese Funktion nicht eventuell gehookt wird und dann dort doch etwas gemacht wird?
Wenn die Funktion irgendwo referenziert wird, darf sie nicht wegfliegen. Externe Hooks kann der Compiler aber nicht berücksichtigen. In C/C++ wäre diese Funktion sowas von weg Da kann man sagen, was man will, der Delphi Compiler optimiert einfach schlecht.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz