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.

Die Switch-Reihenfolge Quellcodes gibts natürlich genau wie die Benchmark-Ergebnisse.

Dieser Beitrag wurde in   PHP veröffentlicht.
FĂĽgen Sie ein Lesezeichen fĂĽr den   permanenten Link hinzu.

Jan hat 152 Beiträge geschrieben

5 Kommentare zu “Switch-case richtig anordnen

  1. adi sagt:

    Hab nur eine frage, passt nicht zu diesem Thema.
    Hast du die Zeit dich einmal mit Templates auseinander zu setzen? Oder was man da genau machen könnte?
    Ich rede hier speziell über die trennung von HTML und PHP

  2. admin sagt:

    @adi: Was meinst Du genau? Wie man ein Templatesystem umsetzt oder wie man ein vorhandenes System möglichst performant hinbekommt? Für zweiteres bräuchte ich die Struktur deines Templatesystems (am besten per Mail an info (at) suchebiete.com)

  3. adi sagt:

    Naja, ich meine wie man die beste Performance hinbekommt, bei der HTML / PHP Trennung eben (Templates)!
    Also kein vorhandenes System

  4. Tim sagt:

    Gute Idee. Daran habe ich noch gar nicht gedacht, die Cases nach Eintrittswahrscheilnichkeit zu sortieren.

    Danke!
    Tim

  5. kennii sagt:

    Ist zwar schon alt, aber warum sollte denn der „default-Fall im switch immer am Ende stehen“ müssen?
    Also das wäre mir echt neu!

    switch($x){
    default:
    echo „Std-User“;
    break;
    case 5:
    echo „Ange …“;
    break;

    }

Eine Antwort schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert mit *

You may use these HTML tags and attributes: <a href=""> <blockquote cite=""> <pre lang=""> <b> <strong> <i> <em>