Seite 2 von 9
					
				Re: Goto sinnvoll nutzen
				Verfasst: 08.04.2014 20:44
				von mk-soft
				Äh... mehr Kaftwerke.
Solltest vieleicht mal auch den Zeitpunkt "start" neu setzen...
Code: Alles auswählen
maxx=90000
i=0
start=ElapsedMilliseconds()
top:
i+1
If i<maxx
  a.s="do_something_"+Str(i)
  Goto top
EndIf
out.s+"Goto:"+Str(ElapsedMilliseconds()-start)+" "
start=ElapsedMilliseconds()
For i=1 To maxx-1
  a.s="do_something_"+Str(i)
Next i
out.s+"For Next:"+Str(ElapsedMilliseconds()-start)+" "
start=ElapsedMilliseconds()
i=1
While i <maxx
  a.s="do_something_"+Str(i)
  i+1
Wend
out.s+"While Wend:"+Str(ElapsedMilliseconds()-start)+" "
start=ElapsedMilliseconds()
i=1
Repeat
  a.s="do_something_"+Str(i)
  i+1
Until i=maxx
out.s+"Repeat Until:"+Str(ElapsedMilliseconds()-start)+" "
Debug out
 
 
 
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 08.04.2014 21:19
				von NicTheQuick
				Ernsthaft, Leute? Jetzt versucht ihr Geschwindigkeitsvergleiche mit Debugger zu machen? Und dann setzt ihr noch den String zusammen während ihr die Zeit stoppt?  
 
Macht es doch wenn schon richtig, wenn ihr hier wieder komische Tests machen wollt:
Code: Alles auswählen
EnableExplicit
Define.i maxx, i, time
Define.s a = "", out = ""
maxx = 40000000
Macro DoSomething()
	a = "do_something_" + Str(i)
EndMacro
;========= Goto Version 1 =========
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 =========
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)
Bei mir ist eigentlich alles gleich schnell. "Goto Version 2" und "For Next" sind aber meistens eher vorne dabei.
Beispielausgabe hat geschrieben:Goto Version 1: 2222
Goto Version 2: 2204
For Next: 2206
While Wend: 2208
Repeat Until: 2189
 
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 08.04.2014 22:33
				von _sivizius
				im Gegenteil, GOTO dauert am längsten. Aber wenn es euch um ein paar µs geht, warum nicht gleich alles in Assembler?
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 08.04.2014 23:54
				von NicTheQuick
				Da wir jetzt mittlerweile in diesem Thread immer mehr verrückte Tests machen, dann lasst uns doch gleich mal den von PB generierten ASM-Code begutachten:
Code: Alles auswählen
;========= Goto Version 1 =========
; i = 0
  MOV    qword [v_i],0
; top1:
l_top1:
; If i < maxx
  MOV    r15,qword [v_i]
  CMP    r15,qword [v_maxx]
  JGE   _EndIf2
; DoSomething()
; i + 1
  MOV    r15,qword [v_i]
  INC    r15
  MOV    qword [v_i],r15
; Goto top1
  JMP    l_top1
; EndIf
_EndIf2:
;========= Goto Version 2 =========
; i = 0
  MOV    qword [v_i],0
; top2:
l_top2:
; If i = maxx
  MOV    r15,qword [v_i]
  CMP    r15,qword [v_maxx]
  JNE   _EndIf4
; Goto ende2
  JMP    l_ende2
; EndIf
_EndIf4:
; DoSomething()
; i + 1
  MOV    r15,qword [v_i]
  INC    r15
  MOV    qword [v_i],r15
; Goto top2
  JMP    l_top2
; ende2:
l_ende2:
;========= For-Schleife =========
; For i = 0 To maxx - 1
  MOV    qword [v_i],0
_For5:
  MOV    r15,qword [v_maxx]
  DEC    r15
  CMP    r15,qword [v_i]
  JL    _Next6
; DoSomething()
; Next
_NextContinue6:
  INC    qword [v_i]
  JNO   _For5
_Next6:
;========= While-Schleife =========
; i = 0
  MOV    qword [v_i],0
; While i < maxx
_While7:
  MOV    r15,qword [v_i]
  CMP    r15,qword [v_maxx]
  JGE   _Wend7
; DoSomething()
; i + 1
  MOV    r15,qword [v_i]
  INC    r15
  MOV    qword [v_i],r15
; Wend
  JMP   _While7
_Wend7:
;========= Repeat-Schleife =========
; i = 0
  MOV    qword [v_i],0
; Repeat
_Repeat8:
; DoSomething()
; i + 1
  MOV    r15,qword [v_i]
  INC    r15
  MOV    qword [v_i],r15
; Until i = maxx
  MOV    r15,qword [v_i]
  CMP    r15,qword [v_maxx]
  JNE   _Repeat8
_Until8:
Man sieht jetzt, dass im Grunde jede Schleife das selbe macht, außer die For-Next-Schleife.
Bei alle Schleifen wird 'i' so inkrementiert:
Außer bei der For-Schleife. Da wird nur das hier gemacht:
Das könnte der Unterschied sein, den ich deutlich in den Zeiten sehen kann, wenn ich das Macro 'DoSomething()' komplett leere:
maxx = 400000000 hat geschrieben:Goto Version 1: 1136
Goto Version 2: 1082
For Next: 879
While Wend: 1088
Repeat Until: 1143
 
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 09.04.2014 12:42
				von bobobo
				mk-soft hat geschrieben:
Solltest vieleicht mal auch den Zeitpunkt "start" neu setzen...
Hätte eher mal "GOTO bed oder Kneipe" machen sollen  

 
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 09.04.2014 16:15
				von _sivizius
				und noch etwas Schwachsinn mehr:
Code: Alles auswählen
EnableExplicit
Define.i maxx, i, time
Define.s a = "", out = ""
maxx = 40000000
Macro DoSomething()
   a = "do_something_" + Str(i)
EndMacro
;========= Goto Version 1 =========
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 =========
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$
;========= Assembler-Schleife =========
a = ""
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$
MessageRequester("Zeiten", out)
aber es ist sogar langsamer o.O.
 
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 09.04.2014 19:48
				von bobobo
				Denk Dir doch mal ein Beispiel aus in dem GOTO schneller ist.
So Simple-Schleifen haben wir nun genug.
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 09.04.2014 20:56
				von _sivizius
				genug Schleifen? Man kann nie zu viele Schleifen haben *duck*
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 09.04.2014 23:21
				von funkheld
				....mov   r15, 0.....
Fehlermeldung vom Compiler.
			 
			
					
				Re: Goto sinnvoll nutzen
				Verfasst: 10.04.2014 00:34
				von NicTheQuick
				funkheld hat geschrieben:....mov   r15, 0.....
Fehlermeldung vom Compiler.
Das kommt davon, wenn man kein 64-Bit-System hat. Bei x86 heißen die Register eben anders. 
