Falsch: For-Schleife herunterzählen schneller als hochzählen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

Falsch: For-Schleife herunterzählen schneller als hochzählen

Beitrag von Sicro »

Irgendwo hier im Forum (möglicherweise auch wo anders) habe ich mal den Hinweis gelesen, dass das Runterzählen bei einer For-Schleife schneller sei als das Hochzählen.
Vielleicht war das bei älteren PB-Versionen mal so, denn mit der PB_5.42B1_x64 kann ich unter Linux keinen nennenswerten Vorteil sehen.
Ich kann mir auch schlecht vorstellen, warum das Hochzählen rechenintensiver sein soll als das Runterzählen.

Code: Alles auswählen

CompilerIf #PB_Compiler_Debugger
  CompilerError "Debugger ausschalten!"
CompilerEndIf
; !!!!!!!!! Purifier ebenfalls ausschalten !!!!!!!!!

#CountOfRounds = 1000000000

time = ElapsedMilliseconds()
For i = 1 To #CountOfRounds : Next
result1 = ElapsedMilliseconds() - time

time = ElapsedMilliseconds()
For i = #CountOfRounds To 1 Step -1 : Next
result2 = ElapsedMilliseconds() - time

MessageRequester("", "For i = 1 To "+#CountOfRounds+" : Next" + #CRLF$ +
                     ">>> Zeit: "+Str(result1)+" ms" + #CRLF$ + #CRLF$ +
                     "For i = "+#CountOfRounds+" To 1 Step -1 : Next" + #CRLF$ +
                     ">>> Zeit: "+Str(result2)+" ms")
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Falsch: For-Schleife herunterzählen schneller als hochzä

Beitrag von matbal »

Das war meiner Meinung nach nur im Zusammenhang, wenn die For-Anweisung eine Berechnung des Endwertes enthielt und man unbedingt auf eine Zwischenvariable verzichten wollte.

Beispiel - CountGadgetItems(Gadget)-1 in jedem Schleifendurchgang durchgeführt:

Code: Alles auswählen

For i = 0 To CountGadgetItems(Gadget) - 1

Berechnung wird nur einmal durchgeführt:

Code: Alles auswählen

For i = CountGadgetItems(Gadget) - 1 To 0 Step -1
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Falsch: For-Schleife herunterzählen schneller als hochzä

Beitrag von mhs »

matbal hat geschrieben:

Code: Alles auswählen

For i = CountGadgetItems(Gadget) - 1 To 0 Step -1
Genau das ist der Hintergrund. pb berechnet bei jedem Schleifendurchlauf den Endwert neu, wenn dafür eine Funktion verwendet wird. Das hat seine Vor- aber auch Nachteile...

Wenn man das aus Performance Gründen verhindern möchte, kann man dafür eine temporäre Variable verwenden oder eben die Schleife umdrehen und runterzählen lassen.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Falsch: For-Schleife herunterzählen schneller als hochzä

Beitrag von Sicro »

Ich danke euch! :)
Das ist anscheinend der einzige Grund.

Hier noch ein Code zur Veranschaulichung:

Code: Alles auswählen

Procedure GetValue()
  Debug "GetValue()"
  ProcedureReturn 3
EndProcedure

Debug "For i = GetValue() To 1 Step -1"
For i = GetValue() To 1 Step -1
  ; ...
Next

Debug ""
Debug "For i = 1 To GetValue()"
For i = 1 To GetValue()
  ; ...
Next
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten