AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Geschwindigkeit von Schleifen

Ein Thema von Dennis07 · begonnen am 10. Dez 2014 · letzter Beitrag vom 11. Dez 2014
Antwort Antwort
Seite 2 von 3     12 3      
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
485 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 12:26
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.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 12:32
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 12:35
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.
Miniaturansicht angehängter Grafiken
disassembly.png  
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 12:40
Habs auch mal schnell ausprobiert.
Miniaturansicht angehängter Grafiken
asm.png  
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#15

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 12:42
Die Geschwindigkeit von Schleifen ist ein erster Näherung "hinreichend schnell" und in zweiter "egal".

Eine for-in Schleife ist vermutlich einen *Hauch* langsamer, da da einige Funktionsaufrufe versteckt sind.
Es ist sinnvoller, sich auf andere Sachen zu konzentrieren:
1. Die Anweisungen in der Schleife
2. Brauche ich die Schleife? Kann ich eine bessere Datenstruktur einsetzen, die schneller ist und auf die Schleife verzichtet?

P.S.: Schleifen führen Anweisungen 0 bis x fach aus, if-then und case-of sind daher keine Schleifen.
das kann ich auch nur unterschreiben.
Zu seligen TP-Zeiten war es so, daß
for to Schneller war als while und 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 if und case nichts mit Schleifen zu tun haben, wurde ja schon geschrieben - warum ist dieser Blödsinn eigentlich nicht auszurotten?.

Case 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 , da dies doch etwas übersichtlicher ist als ellenlange if..then..else -Konstrukte.


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ß
(inc cmp jnz)
Und was schneller ist,dec oder inc dazu hab ich auf die Schnelle nichts gefunden
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (10. Dez 2014 um 13:02 Uhr)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
485 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 12:50
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.
Dennis
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 13:36
Dass eine For-Downto schneller ist als eine For-To, war mir ja schon klar
Woraus hast du denn diese Aussage jetzt geschlussfolgert? Ist nämlich Blödsinn Wie auf meinem Screenshot zu sehen besteht sowohl die for .. to, als auch die for .. downto Schleife aus den exakt gleichen Instruktionen MOV, INC/DEC, CMP, JNE.

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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (10. Dez 2014 um 13:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#18

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 14:08
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 15:20
Daß for i := irgendwas downto 0 do oftmals schneller ist, als ein 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 for i := -irgendwas to 0 do und for i := 0 downto -irgendwas do wäre es praktisch andersrum.


PS: Ohne Optimierung entspricht diese For-Schleife
Delphi-Quellcode:
for i := 0 to xxx do begin
  ...
end;
intern jender While-Schleife.
Delphi-Quellcode:
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;
Nja, eigentlich eher dem
Delphi-Quellcode:
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 >=
Aber das fällt kaum auf, außer man manipuliert an der Schleifenvariable, um z.B. etwas ala for i := 0 to 9 step 3 do basteln, denn bei 0 to 10 landet man quasi in einer Endlosschleife, da die 10 übersprungen wird.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#20

AW: Geschwindigkeit von Schleifen

  Alt 10. Dez 2014, 15:26
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).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 20:49 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