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.