Laufzeitverhalten von if....else if und switch
-
Gregor schrieb:
CoTech schrieb:
Ist das von Laufzeitverhalten her gleich wie eine Anweisung die man auch mit einem switch lösen könnte.?
Nein.
Wer A sagt, muss auch B sagen! Alles andere ist Wichtigtuerei und Spam.
Soweit ich weiss ist switch schneller als if und else, da switch nur auf Gleichheit achtet und if auch mit booleasche Ausdrücke umgehen kann.
Liebe Grüße
Real
-
Mal in C++ geschaut und da ist die if...else-Variante sogar kürzer.
Allerdings jetzt nur was die Anzahl der Zeilen angeht. Ob ein je
schneller als ein jne ist usw.. weiss ich nicht und will ich auch nicht
nachschauenJockel
-
Real schrieb:
Gregor schrieb:
CoTech schrieb:
Ist das von Laufzeitverhalten her gleich wie eine Anweisung die man auch mit einem switch lösen könnte.?
Nein.
Wer A sagt, muss auch B sagen!
Cengiz hat doch für mich B gesagt!
-
CengizS schrieb:
Dieses Vorgehen kann ggü. dem if else schneller sein, wenn es gilt viele Fälle zu unterscheiden.
Das seh ich nicht so:
Pseudo-Asm für if:
lade Register
cmp mit Wert 0
jne elseif1 labelcode fur if==0
jmp Endeelseif1 label:
cmp mit Wert 1
jne elseif2 labelcode für if==1
...Pseudo-Asm für switch:
lade Register
cmp mit Wert 0
je case0 label
cmp mit Wert 1
je case1 label
...case0 label:
code für case0
jmp Ende
...Das ist wohl beides gleich schnell, egal wieviele cases man hat.
Jockel
-
@Jockel: Wie Cengiz schon gesagt hat, wird switch nicht so implementiert, wie du es dir da vorstellst. Es wird eine Sprungtabelle erzeugt.
-
@Jockelx: Nur blöd, dass der switch in ASM so nicht implementiert wird. Der sieht doch viel mehr so aus, oder?
; Sprung in Abhängigkeit von A mov DPTR,#sprungtabelle jmp @A+DPTR sprungtabelle: ajmp adr1 ajmp adr2 ajmp adr3 ajmp adr4 ajmp adr5 adr1: ; ... Code ... adr2: ; ... und so weiter ...
-
Mmmhh, okay ich hab geschaut, wie im Debug-Modus kompiliert wird.
Mag sein, dass das im Release anders aussieht.
Aber wenn wir schonmal dabei sind, dann will ich's jetzt auch verstehen:Entweder ich kapier deinen Code nicht, oder der funktioniert nur
mit lückenlosen cases. Also eincase 0:
case 100:müsste folgende Sprungtabelle
ajmp adr1
99 x nop
ajmp adr2produzieren, oder !?!
-
Denke das ist abhängig von den Werten wie der Compiler das optimiert. Ich könnte mir vorstellen, dass er bei wenigen, weit auseinanderliegenden Werten tatsächlich ein if-else bastelt und die Sprungtabelle nur bei fortlaufenden Werten anwendet (da interessanter).
-
Hi leute.
Danke für die hilfreichen Tips.
Jetzt weis ich ja wie ich optimieren kann.Ich habe mir auch schon gedacht das switch schneller ist aber denken und wissen sind 2 verschiedene Welten.
Bye
-
Servus
Na du wirst mal ein ganz grosser Code-Optimierer.
Bevorzuge eine switch-Anweisung aus Lesbarkeitsgründen!
Da ein schlechter Algo mit exp. Laufzeit mit einer switch-Anw. ggü. einer else if-Anweisung bestimmt dir keine Laufzeitvorteile bring. Also lern erst ordentl. Programmieren, bevor du dir über Code-Optimierung gedanken machst.mfg grenouille
-
Servus
Na du wirst mal ein ganz grosser Kritiker.
Seid langem mal wieder eine Frage, die für den Fragenden und
die Beantwortenden gleichermassen interessant ist und gerade die
kritisierst du?
Also lern erst mal den Stellenwert einer Frage richtig einzuschätzen,
bevor du die Leute kritisierst.mfg Jockel