Laufzeitverhalten von if....else if und switch


  • Mod

    CoTech schrieb:

    Ist das von Laufzeitverhalten her gleich wie eine Anweisung die man auch mit einem switch lösen könnte.?

    Nein.



  • Bei der Verwendung von switch werden die Werte nicht verglichen sondern es wird eine Sprungtabelle generiert. Dieses Vorgehen kann ggü. dem if else schneller sein, wenn es gilt viele Fälle zu unterscheiden. Aber mal abgesehen von der Effizienz ist ein switch einfach besser zu lesen.



  • 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
    nachschauen 😉

    Jockel


  • Mod

    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 label

    code fur if==0
    jmp Ende

    elseif1 label:
    cmp mit Wert 1
    jne elseif2 label

    code 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


  • Mod

    @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 ein

    case 0:
    case 100:

    müsste folgende Sprungtabelle

    ajmp adr1
    99 x nop
    ajmp adr2

    produzieren, 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


Anmelden zum Antworten