Goto sinnvoll nutzen

Für allgemeine Fragen zur Programmierung mit PureBasic.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Goto sinnvoll nutzen

Beitrag von SBond »

ich verfolge mit neugier diesen Thread und frage mich schon ein wenig, wo es enden wird (wahrscheinlich als mathematische Gleichung) :mrgreen:
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Goto sinnvoll nutzen

Beitrag von bobobo »

Ich weiß wo das endet ..

GOTO Mülleimer

:bounce:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
_sivizius
Beiträge: 98
Registriert: 23.10.2013 15:21

Re: Goto sinnvoll nutzen

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Goto sinnvoll nutzen

Beitrag von NicTheQuick »

_sivizius hat geschrieben:das führt aber so zu einem buffer-overflow
Genauer gesagt zu einem Stackoverflow. :allright:
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Goto sinnvoll nutzen

Beitrag 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).
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Goto sinnvoll nutzen

Beitrag 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.
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: Goto sinnvoll nutzen

Beitrag 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
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Goto sinnvoll nutzen

Beitrag 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
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Goto sinnvoll nutzen

Beitrag 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 :-)
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Goto sinnvoll nutzen

Beitrag 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:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten