Seite 2 von 2

Re: Select und If - Geschwindigkeit (ASM)

Verfasst: 24.11.2013 18:51
von STARGÅTE

Code: Alles auswählen

; ElseIf pruef = 2
  JMP   _EndIf3
_EndIf5:
  MOV    ebx,dword [v_pruef]
  CMP    ebx,2
  JNE   _EndIf6
; Debug "Zwei"
; 
; ElseIf pruef = 3

Code: Alles auswählen

; Case 2
  JMP   _EndSelect1
_Case2:
  MOV    ebx,2
  CMP    ebx,[esp]
  JNE   _Case3
; Debug "Zwei"
; 
; Case 3
Wie man am ASM Code sehen kann, sinde beide Aufrufe gleichbedeutend.
In beiden Fällen wird [Memory] über einen Register mit einer Konstanten verglichen.

Re: Select und If - Geschwindigkeit (ASM)

Verfasst: 25.11.2013 08:56
von Chimorin
Super. Ich bin immer davon ausgegangen, dass Select schneller wäre als If (Da man ja auch keine floats benutzen kann). Dann ist Select ja völlig überflüssig und nur dazu da, dass der Code hübscher und übersichtlicher wird?

Re: Select und If - Geschwindigkeit (ASM)

Verfasst: 25.11.2013 10:30
von RSBasic
Select ist nicht überflüssig. Wenn du eine Mehrfachauswahl brauchst, nutzt du eben Select. Bei einer erweiterten If-Abfrage musst du ständig die Variable mehrmals schreiben (Redundanz).
Es kommt immer auf den Anwendungsfall an und es ist sinnvoller und sauberer, wenn man die richtige Abfrageart nimmt. Ist ja genauso wie bei Schleifen, ob kopf-, fußgesteuert oder Zählschleife.

Re: Select und If - Geschwindigkeit (ASM)

Verfasst: 25.11.2013 12:25
von Kiffi
Select ist auch dann nicht überflüssig, wenn man das Ergebnis
einer zeitintensiven Funktion abfragt.

(test1 ist hier der 'worst case'. Der Vorteil zwischen test2 (if) und
test3 (select) ist, dass man keine Extravariable benötigt)

Code: Alles auswählen

EnableExplicit

Define Z1, Z2
Define Len
Define Test1, Test2, Test3, Test4

Procedure.s BuildString()
  Protected ReturnValue.s
  Protected Counter
  For Counter = 0 To 100000
    ReturnValue + " "
  Next
  ProcedureReturn ReturnValue
EndProcedure

; test 1
Z1 = ElapsedMilliseconds()
If Len(BuildString())=0
ElseIf Len(BuildString())=1
ElseIf Len(BuildString())=2
Else
EndIf
Z2 = ElapsedMilliseconds()
Test1 = Z2 - Z1

; test 2
Z1 = ElapsedMilliseconds()
Len = Len(BuildString())
If Len=0
ElseIf Len=1
ElseIf Len=2
Else
EndIf
Z2 = ElapsedMilliseconds()
Test2 = Z2 - Z1

; test 3
Z1 = ElapsedMilliseconds()
Select Len(BuildString())
  Case 0
  Case 1
  Case 2
  Default
EndSelect
Z2 = ElapsedMilliseconds()
Test3 = Z2 - Z1

; test 4
Z1 = ElapsedMilliseconds()
Len = Len(BuildString())
Select Len
  Case 0
  Case 1
  Case 2
  Default
EndSelect
Z2 = ElapsedMilliseconds()
Test4 = Z2 - Z1

MessageRequester("Result", "Test1: " + Str(Test1) + #CRLF$ + 
                           "Test2: " + Str(Test2) + #CRLF$ + 
                           "Test3: " + Str(Test3) + #CRLF$ + 
                           "Test4: " + Str(Test4))
Grüße ... Kiffi

Re: Select und If - Geschwindigkeit (ASM)

Verfasst: 25.11.2013 14:39
von bobobo
[sot]
hihi ..ich lach mich schlapp

auf einmal doch wieder goto

das erinnert mich an den bekloppten Zorg (das 5.Element)
"If you want something done, do it yourself. Yep!"
[/sot]

Re: Select und If - Geschwindigkeit (ASM)

Verfasst: 26.11.2013 20:02
von mk-soft
Wenn der Wert der über "Case" ausgewerte ist in einen festen Bereich liegt kann auch über eine Tabelle direkt verzweigen.

Kleine Beispiel wie ich es auch in meinen VisualGenerate verwende...

Code: Alles auswählen


Prototype MyProtoInvoke()

Structure udtCallFunction
  Invoke.MyProtoInvoke[0]
EndStructure


Global *CallFunction.udtCallFunction = ?CallFunctionList

Procedure fc1()
  Debug "Function 1"
EndProcedure

Procedure fc2()
  Debug "Function 2"
EndProcedure

Procedure fc3()
  Debug "Function 3"
EndProcedure

Procedure fc5()
  Debug "Function 5"
EndProcedure

Procedure fcDefault()
  Debug "Function Default"
EndProcedure


Debug "Aufruf über Select"
For i = 0 To 6 ; Test
  Select i
    Case 1 : fc1()
    Case 2 : fc2()
    Case 3 : fc3()
    Case 5 : fc5()
    Default : fcDefault()
  EndSelect
Next

Debug "Aufruf über Tabelle"
For i = 0 To 6 ; Test
  *CallFunction\Invoke[i]()
Next

DataSection
  CallFunctionList:
  Data.i @fcDefault()
  Data.i @fc1()
  Data.i @fc2()
  Data.i @fc3()
  Data.i @fcDefault()
  Data.i @fc5()
  Data.i @fcDefault()
EndDataSection

FF :wink: