Seite 3 von 9

Re: Goto sinnvoll nutzen

Verfasst: 10.04.2014 01:04
von SBond
ich verfolge mit neugier diesen Thread und frage mich schon ein wenig, wo es enden wird (wahrscheinlich als mathematische Gleichung) :mrgreen:

Re: Goto sinnvoll nutzen

Verfasst: 10.04.2014 14:21
von bobobo
Ich weiß wo das endet ..

GOTO Mülleimer

:bounce:

Re: Goto sinnvoll nutzen

Verfasst: 10.04.2014 16:03
von _sivizius
oder so:

Code: Alles auswählen

Macro DoSomething()
   a$ = "do_something_" + Str(i)
EndMacro
Procedure didum(i, maxx)
  If i<maxx
    DoSomething()
    didum(i+1, maxx)
  EndIf
EndProcedure
maxx = 40000000
start=ElapsedMilliseconds()
didum(0, maxx)
out.s+"Procedure:"+Str(ElapsedMilliseconds()-start)
Debug out
das führt aber so zu einem buffer-overflow

Re: Goto sinnvoll nutzen

Verfasst: 10.04.2014 16:23
von NicTheQuick
_sivizius hat geschrieben:das führt aber so zu einem buffer-overflow
Genauer gesagt zu einem Stackoverflow. :allright:

Re: Goto sinnvoll nutzen

Verfasst: 11.04.2014 15:36
von Helle
Freitag nachmittag auf Arbeit, Wetter besch... und ´nen Haufen Minus-Stunden auf dem Arbeitszeit-Konto: Was macht man da? Man schaut sich auch sowas hier an und hat endlich mal die Chance im Mülleimer zu landen :mrgreen: .
Also: Oben und unten im Code 3-4 Zeilen Assembler und dazwischen PB-String-Gedöns in einer Schleife bringt überhaupt nichts. Da spielen zuviel andere Sachen mit rein (z.B. Alignments). Dazu ein kurzer Test:

Code: Alles auswählen

EnableExplicit

Define.i maxx, i, time
Define.s a = "", out = ""
maxx = 40000000

Macro DoSomething()
   a = "do_something_" + Str(i)
EndMacro


;========= Assembler-Schleife =========
time = ElapsedMilliseconds()
EnableASM
  mov   r15, 0
  mov   r14, qword [v_maxx]
  jump:
  inc   r15
  DoSomething()
  dec   r14
  jnz   l_jump
  mov   qword [v_i],r15
DisableASM
time = ElapsedMilliseconds() - time
out + "Assembler: " + time + #LF$

;========= Goto Version 1 =========
a = ""
time = ElapsedMilliseconds()
i = 0
top1:
If i < maxx
   DoSomething()
   i + 1
   Goto top1
EndIf
time = ElapsedMilliseconds() - time
out + "Goto Version 1: " + time + #LF$

;========= Goto Version 2 =========
a = ""
time = ElapsedMilliseconds()
i = 0
top2:
If i = maxx
   Goto ende2
EndIf
DoSomething()
i + 1
Goto top2
ende2:

time = ElapsedMilliseconds() - time
out + "Goto Version 2: " + time + #LF$

;========= For-Schleife =========
a = ""
time = ElapsedMilliseconds()
For i = 0 To maxx - 1
   DoSomething()
Next
time = ElapsedMilliseconds() - time
out + "For Next: " + time + #LF$

;========= While-Schleife =========
a = ""
time = ElapsedMilliseconds()
i = 0
While i < maxx
   DoSomething()
   i + 1
Wend
time = ElapsedMilliseconds() - time
out + "While Wend: " + time + #LF$

;========= Repeat-Schleife =========
a = ""
time = ElapsedMilliseconds()
i = 0
Repeat
   DoSomething()
   i + 1
Until i = maxx
time = ElapsedMilliseconds() - time
out + "Repeat Until: " + time + #LF$


MessageRequester("Zeiten", out)

Zeiten auf einem 8120-er Bulldozer:
Assembler: 6978
Goto Version 1: 8085
Goto Version 2: 8076
For Next: 8171
While Wend: 8104
Repeat Until: 8200
Was habe ich geändert? Ganz einfach: Assembler mal ganz nach oben verschoben und den Gotos einen Start mit leerem String gegönnt.
So, das sollte es aber auch gewesen sein (zumindest mit dieser "Test-"Konfiguration).

Re: Goto sinnvoll nutzen

Verfasst: 11.04.2014 15:58
von NicTheQuick
Auf einem Intel(R) Core(TM) i7-3820QM CPU, keine Ahnung wie er sich gerade getaktet hab. Sitze mit Akku im Zug. :D
Assembler: 1589
Goto Version 1: 2131
Goto Version 2: 2132
For Next: 2145
While Wend: 2148
Repeat Until: 2150
Faszinierend, helle.
Das bedeutet aber, dass Assember < Goto < PB-Native-Schleifen.

Re: Goto sinnvoll nutzen

Verfasst: 11.04.2014 16:27
von Andreas21
Assembler: 6206
Goto Version 1: 7755
Goto Version 2: 7712
For Next: 7728
While Wend: 7847
Repeat Until: 7778
Phenom II x4 945 3 Ghz im Eco Modus

Re: Goto sinnvoll nutzen

Verfasst: 11.04.2014 18:40
von Helle
Nic, Du machst mir Angst und Bange :lol: ! Aber der Reihe nach: Wichtig ist mir erstmal klar zustellen, das meine "Lästerei" nicht gegen Deinen Ursprungs-Thread zielt. Ich denke, da verstehen wir uns :) .
Aber jetzt: Ich bin jetzt daheim und habe meinen obigen Code auf einem i7-4770K mit 4.0 GHz getestet (der FX-8120 lief übrigens mit 3.6 GHz). Die Werte:
Assembler: 3673
Goto Version 1: 4403
Goto Version 2: 4248
For Next: 4262
While Wend: 4186
Repeat Until: 4269
Ich wollte ja zeigen, das da etliches von kaum beeinflussbaren Details abhängt (für den normalen User). Aber die Zeiten Deines Laptops haben mich schwer verunsichert. Ein Blick in Intels Datenbank zeigt für den i7-3820QM einen max.Turbo von 3.7 GHz. Auf welchem Schienennetz warst Du denn unterwegs? Mit Doc Emmett Brown :lol: ?
Ein gut gelaunter
Helle

Re: Goto sinnvoll nutzen

Verfasst: 11.04.2014 18:48
von NicknameFJ
Helle hat geschrieben: Auf welchem Schienennetz warst Du denn unterwegs? Mit Doc Emmett Brown :lol: ?
Ein gut gelaunter
Helle

Muß nicht unbedingt mit Doc Emmett Brown gewesen sein.

Albert Einstein und die allgemeine Relativitätstheorie geben Erklärung genug:

Für einen Betrachter in Relativbewegung (Nic) vergeht die Zeit langsamer als für den Betrachter der sich nicht bewegt (Helle). Folglich braucht das Programm bei Nic auch deutlich weniger Zeit.

NicknameFj mit ebenso guter Laune :-)

Re: Goto sinnvoll nutzen

Verfasst: 11.04.2014 18:52
von bobobo
Ich könnte wetten (*), dass Nic im Code vorher die 40000000 gekürzt hat, sein Rechner sollte wohl sicher fertig werden
mit der looperei bevor der Zug trotz Verspätung im Bahnhof einfährt.

:mrgreen:
(*) wenn ich jemals wetten würde

@Helle
Lustig ist bei deinem Code im Taskmanager zu gucken wie die Prozessoren (wenn man mehr als einen hat) pro loop an
und abspringen.

und jetzt fehlt noch eine Version für Multiprozessoren :mrgreen: