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)

Re: Goto sinnvoll nutzen
Verfasst: 10.04.2014 14:21
von bobobo
Ich weiß wo das endet ..
GOTO Mülleimer

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.

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

.
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.
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

! 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

?
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

?
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.
(*) 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
