Select und If - Geschwindigkeit (ASM)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Select und If - Geschwindigkeit (ASM)

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Select und If - Geschwindigkeit (ASM)

Beitrag 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?
Bild

- formerly known as Bananenfreak -
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Select und If - Geschwindigkeit (ASM)

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Select und If - Geschwindigkeit (ASM)

Beitrag 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
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Select und If - Geschwindigkeit (ASM)

Beitrag 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]
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Select und If - Geschwindigkeit (ASM)

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten