• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

CASE vs einfach IF-Bedingung - Performancefrage

StephanBo

Mitglied
Szenariobeispiel:

16 verschiedene Bundesländer haben unterschiedlichen Content. Dieser ist nicht in einer DB gespeichert sondern als HTML-Quellcode direkt eingearbeitet.

Mittels der URI und GET-Parameter soll nun der jeweilige Content auf das Bundesland bezogen dargestellt werden.

Hierzu kann ich nun eine einfach if-Abfrage machen
PHP:
if (bundesland == nrw){...} if (bundesland == bayern){...}usw.

oder aber auch mittels der CASE-Anweisung die jeweilige Zuordnung vornehmen.

Ich weiß, dass hier im Optimalfall CASE die bessere Alternative wäre, nur leider habe ich alles schon mittels IF-Anweisung programmiert. Ich würde an dieser Stelle nun gerne wissen, ob der Performance-Unterschied beider Methoden hier merkbar wäre, oder ob sich dies nur im Millisekunden-Bereich abspielt und von keinem Menschen wahrgenommen werden wird.
 
Der Performance-Unterschied spielt fast keine Rolle, das ist eine Frage der Übersichtlichkeit des Quellcodes und da ist switch/case deutlich besser. In wie weit switch/case schneller ist oder nicht, könntest du mit einem Testprogramm herausfinden, ich hab's zumindest noch nicht gemessen.

Testprogramm:
PHP:
<?php

   $x = "g";
   
   $t1 = microtime(true);
   
   for ($i = 0; $i < 1000; $i++)
   {
   if ($x == "a") 
      $y = "a";
      
   if ($x == "b") 
      $y = "b";

   if ($x == "c") 
      $y = "c";
      
   if ($x == "d") 
      $y = "d";

   if ($x == "e") 
      $y = "e";
      
   if ($x == "f") 
      $y = "f";

   if ($x == "g") 
      $y = "g";
      
   if ($x == "h") 
      $y = "h";

   if ($x == "i") 
      $y = "i";
      
   if ($x == "j") 
      $y = "j";

   if ($x == "k") 
      $y = "k";
      
   if ($x == "l") 
      $y = "l";
      
   if ($x == "m") 
      $y = "m";
      
   if ($x == "n") 
      $y = "n";      
      
   if ($x == "o") 
      $y = "o";
      
   if ($x == "p") 
      $y = "p";      
   }

   echo "Diff 1 = " . (microtime(true) - $t1) . "<br>";
   
   $t1 = microtime(true);
   
   for ($i = 0; $i < 1000; $i++)
   {
    switch ($x)
    {
       case "a": $y = "a"; break;
       case "b": $y = "b"; break;
       case "c": $y = "c"; break;
       case "d": $y = "d"; break;
       case "e": $y = "e"; break;
       case "f": $y = "f"; break;
       case "g": $y = "g"; break;
       case "h": $y = "h"; break;
       case "i": $y = "i"; break;
       case "j": $y = "j"; break;
       case "k": $y = "k"; break;
       case "l": $y = "l"; break;
       case "m": $y = "m"; break;
       case "n": $y = "n"; break;
       case "o": $y = "o"; break;
       case "p": $y = "p"; break;
   }
   } 
   
   echo "Diff 2 = " . (microtime(true) - $t1) . "<br>";
   
?>
Ausgabe:
Diff 1 = 0.00218200683594
Diff 2 = 0.000978946685791
 
Zuletzt bearbeitet von einem Moderator:
Ich schätze mal, mit einem if/elseif wird man das noch beschleunigen können, trotzdem würde ich bei switch/case bleiben.
 
Jo, dein Vergleich ist nicht fair. Du müsstest schon elseif wählen. (Um euch die Zeit zu sparen: Das ist auf meinem System schneller als switch-case. Ich habe allerdings == in === geändert.)

Laut Deiner Rechnung ist die Differenz ja doch bemerklich (mehr als das Doppelte) !!!

Das mag bemerklich wirken, aber so kannst du nicht über Performance nachdenken, denn dein Skript wird auch noch andere Dinge tun, die ebenfalls Zeit benötigen. Wenn die 300 ms dauern, relativiert sich eine Halbierung der Ausführzeit eines solchen Konstrukts von vielleicht 1 ms auf 0,5 ms doch sehr schnell, weil du dann insgesamt nicht mehr bei 301 ms bist, sondern meinetwegen bei 300,5 ms. (Am Rande: Laut dem Benchmark dauert ein Durchlauf nicht 1 ms, sondern ein oder zwei Tausendstel einer Millisekunde.) Das wäre ein Unterschied von 300,002 ms zu 300,001 ms. Das wäre ein Dreihunderttausendstel. Wenn der Rest nur 10 ms dauert, wäre es immer noch ein Zehntausendstel.

Oder anders gesagt: Eine schnelle Operation ist auch dann noch schnell, wenn sie doppelt so lange benötigt oder auch zehnmal so lange. Anschauliches Beispiel: Wenn du morgens doppelt so lange zum Anziehen deiner Schuhe benötigen würdest, würde das deine Morgenroutine vermutlich nicht spürbar beeinflussen.

Es ist praktisch gesehen sinnfrei, Performance auf dem Level zu diskutieren. Es gibt im Zweifelsfall wesentlich effektivere Methoden zur Steigerung der Performance (Caching etwa). Die Faustregel ist, beim Schreiben von Code auf Verständlichkeit und Lesbarkeit zu setzen. (Ich habe da prinzipiell keine Präferenz zwischen if-elseif und switch-case.) Und zu Performance-Betrachtungen ist die Faustregel, einzelne Aspekte immer im Gesamtkontext zu sehen. Um noch mal das Beispiel zu bemühen: Du kannst deine Schuhe noch so schnell anziehen, wesentlich effektiver wäre es vermutlich, näher an deinem Arbeitsplatz zu wohnen.

Bei Performance-Analyse geht es immer um Verhältnismäßigkeiten und darum, die wahren Flaschenhälse zu finden, die die Zeit fressen. Das ist vor allem eine Sache von Erfahrung, aber selbst dann liegst du noch oft daneben. Sicherer ist es, konkret zu messen. → Profiling

Konkret zur Ausgangsfrage:

Ich würde an dieser Stelle nun gerne wissen, ob der Performance-Unterschied beider Methoden hier merkbar wäre, oder ob sich dies nur im Millisekunden-Bereich abspielt und von keinem Menschen wahrgenommen werden wird.

Forget About It
 
Zuletzt bearbeitet:
Zurück
Oben