Switch-case richtig anordnen

Oft wird das switch-case-Konstrukt beim Programmieren verwendet, um größere if-Aneinanderreihungen zu vermeiden. Und das ist auch gut so ????
Die einzelnen Fälle (cases), die vom switch-Block behandelt werden, solten dabei aber nicht per Zufall oder so wie es gerade in den Sinn kommt angeordnet werden, sondern in der Reihenfolge der Eintrittswahrscheinlichkeiten. Der Fall, der wahrscheinlich am häufigsten auftritt, sollte an erster Stelle stehen – der, der fast nie auftritt an letzter Stelle.

Ich möchte es am Beispiel einer Benutzerberechtigung verdeutlichen. Wir haben 1 Administrator, 2 Moderatoren, 1 Webmaster, 10 Premium-User, 100 angemeldete User und eine unbekannte Anzahl von unangemeldeten Usern (Leute, die einfach mal auf der Seite vorbeischauen oder angemeldete User, die noch nicht eingeloggt sind).
Wir gehen mal davon aus, dass die Wahrscheinlichkeiten so verteilt sind, wie die Anzahl der einzelnen Benutzertypen. Die Wahrscheinlichkeit, dass es sich bei einem Seitenaufruf um einen Administratoren oder Webmaster handelt, ist viel geringer als dass ein angemeldeter User die Seite aufruft. Und deshalb müssen wir die Reihenfolge der case-Blöcke genau danach anordnen:

switch($rechteID) {
    case 5:
      echo "Angemeldeter User";
 break;
    case 4:
     echo "Premium-User";
 break;
    case 2:
      echo "Moderator";
 break;
    case 3:
      echo "Webmaster";
 break;
    case 1:
      echo "Administrator";
 break;
    default:
      echo "Nicht angemeldet";
 
}

Da jedes case einzeln überprüft wird, muss – wenn sich ein Administrator anmeldet – erst geprüft werden, ob es sich um einen User handelt, anschließend ob um einen Premium-User usw bis man bei Administrator angekommen ist. Der normale User allerdings wird am schnellsten erkannt – ganz wie es der Häufigkeit entspricht. Es sei nochmal gesagt: Es geht hier nicht darum, dass die Seite dann wohl möglich für Premium-User langsamer angezeigt wird (ein paar Millisekunden sind nicht bemerkbar) sondern darum, dass der Server den Job möglichst schnell durch hat, um zum nächsten überzugehen – für den sind nämlich ein paar Millisekunden eine Menge Zeit.
Man beachte: Die wahrscheinlich häufigste Gruppe sind wohl die unbekannten User (nicht angemeldet). Wenn wir diese als default betrachten, müssen sie am Ende stehen, da der default-Fall im switch immer am Ende stehen muss. Weisen wir denen eine Extra-Rechtegruppe zu (bspw ID 6), dann würden wir sie als allerersten case-Block nutzen.

Die Auswertung:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
result_switch_right.php 13.449339 s 1.345 ms 100 %
result_switch_wrong.php 15.592421 s 1.559 ms 115 % (+ 15%)

Ich bin im Script von der rechteID=5 ausgegangen, also vom wahrscheinlichsten Fall (angemeldeter User). Und in diesem Fall ergibt sich ein respektabler Performance-Unterschied.



Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0