![]() |
Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
Liste der Anhänge anzeigen (Anzahl: 1)
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; |
AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
Hallo,
Delphi-Quellcode:
Ich denke, das a*100 optimiert der Compiler.
a := 1.71;
for I := 0 to 500000 do c := Round(a*100); Das hier vielleicht nicht.
Delphi-Quellcode:
Hast Du denn die Optimierung in der IDE eingeschaltet?
or I := 0 to 500000 do
begin a := 1.71; c := Round(a*100); |
AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
Round wird möglicherweise inline ausgeführt, es entfallen so die Funktionsaufrufe.
|
AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
Zitat:
Delphi-Quellcode:
sorgt dafür, dass eine ganze Reihe an Operationen ausgeführt werden. Außerdem hast du Overhead durch das Stack-Frame, den
temp
Delphi-Quellcode:
ansich, etc. Leider ist der Delphi Compiler sogar im Release mode so "dumm", dass er diese Anweisungen nicht raus-optimiert.
CALL
|
AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
Zitat:
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:
1. ebp Register auf dem Stack sichern, weil
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 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). |
AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
Zitat:
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:
Bei String und Dergleichen kommt vom Compiler auch noch ein Try-Finally um die ganze Funktion, damit diese Variablen immer ordnungsgemäß aufgeräumt werden. |
AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
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! |
AW: Geshwindigkeit?> Nichts Vs Round, Round gewinnt, aber wieso?!
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz