Seite 1 von 1

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

Verfasst: 20.02.2016 13:47
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")

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

Verfasst: 20.02.2016 14:17
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

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

Verfasst: 21.02.2016 10:14
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.

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

Verfasst: 21.02.2016 12:38
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