Anzahl IF-Statements Auswirkungen auf Performance?



  • Hi,

    ist zwar eigentlich eine dumme frage - aber auch die müssen gestellt werden.
    wie es er titel schon sagt, möchte ich wissen ob die anzahl von if-statements auswirkungen auf die laufzeit / performance hat. angenommen ich hab 2 möglichkeiten - welche ist durchschnittlich die schnellere variante?

    bitte bedenken, dass beide varianten letztendlich zum gleichen ergebnis führen sollen - die anzahl der verabeitenden statements würde tatsächlich so aussehen

    # 1

    if x == 1
    {
      stat1
      stat2
      stat3
      stat4
      stat5
    }
    else if x == 2
    {
      stat1
      stat2
      stat3
      stat4
      stat5
    }
    

    # 2

    if x == 1
    {
     stat1
     stat2
    }
    else if x == 2
    {
     stat1
     stat2
    }
    else if x == 3
    {
     stat1
     stat2
    }
    else if x == 4
    {
     stat1
     stat2
    }
    else
    {
     stat1
     stat2
    }
    

    mfg & thx



  • Also ich verstehe den Sinn des Codes nicht ganz:

    Im ersten Falle werden die Zeilen stat1 bis stat4 immer ausgefuehrt wenn x gleich y ist (das zweite else-if wird nie erreicht) und im zweiten Falle werden die Zeilen stat1 und stat2 immer ausgefuehrt.

    NB: Da fehlen Klammern!



  • vielleicht klappts mit konkreten zahlen bei den bedingungen



  • jeder vergleich verbraucht zyklen. ein compiler kann da eventuell was optimieren bei identischen vergleichen.

    @OP: komme bitte mit etwas konkreterem als diesem sinnlosen code. du willst schliesslich konkrete antworten.



  • Die eigentliche Frage ist eher, was ist schneller: Eine "switch-case" Konstruktion oder ein "if-else". Ich habe da noch nie einen singifikanten Unterschied festgestellt. Der gnaze Vorteil der if-else Konstrukte ist, dass sie flexibler sind, da ein switch nur gegen Konstanten abfragen kann.



  • mach nen benchmark



  • Ich habe mir den Spass gemacht, zwei Listings zu compilieren:

    Listing - switch:

    #include <stdio.h>
    #include <string.h>
    
    int main (int  argc, char **argv)
    {
    
       switch (argc)
        {
            case 0: printf ("0\n");
                    break;
            case 1: printf ("1\n");
                    break;
            case 2: printf ("2\n");
                    break;
            case 3: printf ("3\n");
                    break;
            case 4: printf ("4\n");
                    break;
            default: printf ("mehr\n");
         }
    
         return 0;
    
    }
    

    und Listing 2 - if-else:

    nt main (int  argc, char **argv)
    {
    
        if (argc == 0)
            printf ("0\n");
        else if (argc == 1)
            printf ("1\n");
        else if (argc == 2)
            printf ("2\n");
        else if (argc == 3)
            printf ("3\n");
        else if (argc == 4)
            printf ("4\n");
        else
            printf ("mehr\n");
    
        return 0;
    }
    

    Korrektur:

    Tatsaechlich macht der if-else zwei Assembleranweisung mehr:

    cmp $0x2,%eax
    jne 80483eb <main+0x47>

    Also einen Vergleich- und einen Sprungbefehl. Ich glaube aber nicht, dass diese wenigen Zyklen wirklich einen merklichen Unterschied machen.

    Eigentlich sind diese Assemble-Statements auch gut zu erklaren mit der flexibleren Struktur der if-else Konstrukte.


Anmelden zum Antworten