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
