![]() |
AW: Geschwindigkeit von Schleifen
Danke bis hierher schonmal, allerdings könntet ihr mir vielleicht sagen, wie man herausfindet, woraus genauer die von dem Compiler erzeugten Schleifenquelltexte bestehen?
Denn bei der Ausführung des aktuellen Befehls, wird die For-Schleife beispielsweise als solches ausgeführt und es wird nicht zu einem Quelltext gesprungen. |
AW: Geschwindigkeit von Schleifen
Selbst wenn repeat .. until aus irgendeinem Grund schneller sein sollte als for .. do, würde ich hier (ua. aufgrund der Lesbarkeit des Codes) definitiv niemals optimieren. Solche Dinge sind meiner Meinung nach Compilersache!
Wie himitsu schon sagte sind es im Grunde genommen nur "gotos" (Jumps). Du solltest im Assembler Code Mnemonics wie JMP, JNZ, JE, JZ ... sehen (da gibts ne ganze Reihe). Bei for Schleifen wird irgendwo ein INC bzw. DEC zu finden sein und gelegentlich gehört auch noch ein CMP mit dazu. Kann man so generisch gar nicht sagen. |
AW: Geschwindigkeit von Schleifen
Liste der Anhänge anzeigen (Anzahl: 1)
Beispielbild im Anhang.
Schau mal unter Ansicht -> Debug-Fenster -> CPU-Ansicht Wir sehen dass eine for-downto-Schleife in Assembler irgendwie anders (kürzer) ist als eine for-to. |
AW: Geschwindigkeit von Schleifen
Liste der Anhänge anzeigen (Anzahl: 1)
Habs auch mal schnell ausprobiert.
|
AW: Geschwindigkeit von Schleifen
Zitat:
Zu seligen TP-Zeiten war es so, daß
Delphi-Quellcode:
Schneller war als
for to
Delphi-Quellcode:
und
while
Delphi-Quellcode:
.
repeat
Diese beiden waren gleich schnell, den Unterschied machte die Abfrage der Abbruchbedingung aus, was aber nur relevant ist, wenn man um die Millisekunde feilschen muß. Das
Delphi-Quellcode:
und
if
Delphi-Quellcode:
nichts mit Schleifen zu tun haben, wurde ja schon geschrieben - warum ist dieser Blödsinn eigentlich nicht auszurotten?.
case
Delphi-Quellcode:
wäre theoretisch schneller, wenn es mit einer Sprungtabelle realisiert würde, das ist allerdings nicht der Fall (soweit ich weiß), somit ist es letztlich für den Compiler egal was eingesetzt wird. Im Sourcecode bevorzuge ich
Case
Delphi-Quellcode:
, da dies doch etwas übersichtlicher ist als ellenlange
case
Delphi-Quellcode:
-Konstrukte.
if..then..else
Gruß K-H P.S. @Schönster Mann von allen Ich glaube Du hast Dich verguckt, die Schleife ist in beiden Fällen gleich lang/groß:mrgreen: (inc cmp jnz) Und was schneller ist,
Delphi-Quellcode:
oder
dec
Delphi-Quellcode:
dazu hab ich auf die Schnelle nichts gefunden
inc
|
AW: Geschwindigkeit von Schleifen
Ah, danke, genau das habe ich gesucht ;) Entschuldigt bitte, dass mir die Disassembly-Anzeige-Funktionalität nicht geläufig war :)
Dass eine For-Downto schneller ist als eine For-To, war mir ja schon klar, da ja eine For-To eh immer eine invertierte For-Downto ist. |
AW: Geschwindigkeit von Schleifen
Zitat:
repeat .. until sieht auf den ersten Blick kompakter aus, als die anderen Schleifen (es fehlt das INC/DEC), aber man muss bedenken, dass die Zählervariable hier manuell im Schleifenkörper gesetzt werden muss. Demnach würde hier zumindest noch eine weitere Instruktion hinzukommen. while .. true hat den größten Overhead, da vor Begin der eigentlichen Schleife nochmal dediziert geprüft wird, ob die Bedingung überhaupt erfüllt ist. Dieser Check (hier: CMP, JG) wird allerdings nur ein einziges Mal ausgeführt und beeinflusst daher die eigentliche Laufzeit der Schleife nicht. Fazit: In dem von mir getesteten Fall (lokale Funktion mit lokaler Zählervariable) sind alle Schleifen gleich performant. |
AW: Geschwindigkeit von Schleifen
Es kann da auch keinen großen Performanceunterschied geben. Letzendlich ist entweder nur die Syntax in Delphi anders und der Code Assemblercode ist der gleiche oder die Assemblerbefehle tauchen ggf. in einer minimal anderen Reihenfolge auf. Letztendlich läuft es immer auf eine bestimmte Kombination von cmp/inc/jmp hinaus.
|
AW: Geschwindigkeit von Schleifen
Daß
Delphi-Quellcode:
oftmals schneller ist, als ein
for i := irgendwas downto 0 do
Delphi-Quellcode:
,
for i := 0 to irgendwas do
liegt nicht an der Richtung, sondern meistens nur daran, daß das Ende hartecodet werden kann und keine Variable zwischengespeichert/ausgewertet werden muß. Denn bei
Delphi-Quellcode:
und
for i := -irgendwas to 0 do
Delphi-Quellcode:
wäre es praktisch andersrum.
for i := 0 downto -irgendwas do
PS: Ohne Optimierung entspricht diese For-Schleife
Delphi-Quellcode:
intern jender While-Schleife.
for i := 0 to xxx do begin
... end;
Delphi-Quellcode:
Nja, eigentlich eher dem
i := 0;
Ende := xxx; // Dieses hier ist auch der Grund, warum man Löschen besser rückwärts erledigt. while xxx <= Ende do begin ... Inc(i); end;
Delphi-Quellcode:
Aber das fällt kaum auf, außer man manipuliert an der Schleifenvariable, um z.B. etwas ala
i := 0;
Ende := xxx; // Dieses hier ist auch der Grund, warum man Löschen besser rückwärts erledigt. if i <= Ende then repeat ... Inc(i); until xxx = Ende; // = und nicht >=
Delphi-Quellcode:
basteln, denn bei
for i := 0 to 9 step 3 do
Delphi-Quellcode:
landet man quasi in einer Endlosschleife, da die 10 übersprungen wird. :angel2:
0 to 10
|
AW: Geschwindigkeit von Schleifen
War da nicht mal was, dass der Vergleich auf 0 schneller ist, als der Vergleich auf '<Variable>'? Aber egal, das sind eh Peanuts.
Wichtig sind doch eh die inneren Werte (der Schleife). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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 by Thomas Breitkreuz