http://danielkeppler.com

mein Blog über Guatemala und SEO

PHP: Was ist schneller – IF oder Switch?

Man sollte beim Programmieren immer bestrebt sein nicht nur guten Code zu schreiben, sondern auch schnellen Code zu schreiben. High-Traffic-Sites beschäftigen ganze Teams, die bestrebt sind Optimierungen bzw. Perfomancegewinne herbeizuführen. Wie sinnvoll solche Bestrebungen sind, will ich heute an einem kleinem Beispiel aufzeigen.

Fragestellung: Welche Kontrollstruktur sollte ich nach Möglichkeit verwenden – if oder switch? Diese Frage taucht immer wieder in diversen Foren auf. Ich will an einem kleinen Beispiel einen Performancevergleich durchführen und die Ergebnisse hier veröffentlichen.

Prüfung: Wieviel Tage sind es noch bis Samstag?
Um einen repräsentativen Vergleich zu erzielen, wird der PHP-Code 1.000.000 (1 Million) Mal ausgeführt. So kann man leicht seinen Code testen und aus die gewonnen Rückschlusse in der Praxis richtig einsetzen.
Testumgebung: WAMP System (xampp) – Apache 2.x, PHP 4.4.4, keine Modifikation (Beschleuniger/Accelerator usw.)

Die IF-Variante

PHP:

  1. <?
  2. //IF Variante
  3. function timer_stop() {
  4. global $timestart, $timeend;
  5. $mtime = microtime();
  6. $mtime = explode(‘ ‘,$mtime);
  7. $mtime = $mtime[1] + $mtime[0];
  8. $timeend = $mtime;
  9. $timetotal = $timeend-$timestart;
  10. return number_format($timetotal,5);
  11. }
  12. function timer_start() {
  13. global $timestart;
  14. $mtime = explode(‘ ‘, microtime() );
  15. $mtime = $mtime[1] + $mtime[0];
  16. $timestart = $mtime;
  17. return true;
  18. }
  19. timer_start();
  20. $heute = date(“l”);
  21. for ($i=0; $i<1000000; $i++) {
  22. if ($heute==‘Monday’) $resttage = 5;
  23. if ($heute==‘Tuesday’) $resttage = 4;
  24. if ($heute==‘Wednesday’) $resttage = 3;
  25. if ($heute==‘Thursday’) $resttage = 2;
  26. if ($heute==‘Friday’) $resttage = 1;
  27. if ($heute==‘Saturday’) $resttage = 0;
  28. if ($heute==‘Sunday’) $resttage = 6;
  29. }
  30. echo ‘IF Variante<br/>’;
  31. echo ‘Bis Samstag sind es noch ‘.$resttage.‘ Tage<br/>’;
  32. echo ‘Ladezeit:’. timer_stop();
  33. ?>

Die Switch-Variante

PHP:

  1. <?
  2. //Switch Variante
  3. function timer_stop() {
  4. global $timestart, $timeend;
  5. $mtime = microtime();
  6. $mtime = explode(‘ ‘,$mtime);
  7. $mtime = $mtime[1] + $mtime[0];
  8. $timeend = $mtime;
  9. $timetotal = $timeend-$timestart;
  10. return number_format($timetotal,5);
  11. }
  12. function timer_start() {
  13. global $timestart;
  14. $mtime = explode(‘ ‘, microtime() );
  15. $mtime = $mtime[1] + $mtime[0];
  16. $timestart = $mtime;
  17. return true;
  18. }
  19. timer_start();
  20. $heute = date(“l”);
  21. for ($i=0; $i<1000000; $i++) {
  22. switch ($heute)
  23. {
  24. case “Monday”:
  25. $resttage = 5;
  26. break;
  27. case “Tuesday”:
  28. $resttage = 4;
  29. break;
  30. case “Wednesday”:
  31. $resttage = 3;
  32. break;
  33. case “Thursday”:
  34. $resttage = 2;
  35. break;
  36. case “Friday”:
  37. $resttage = 1;
  38. break;
  39. case “Saturday”:
  40. $resttage = 0;
  41. break;
  42. case “Sunday”:
  43. $resttage = 6;
  44. break;
  45. }
  46. }
  47. echo ‘Switch/Case Variante<br/>’;
  48. echo ‘Bis Samstag sind es noch ‘.$resttage.‘ Tage<br/>’;
  49. echo ‘Ladezeit:’. timer_stop();
  50. ?>

Nach diversen Test auf meiner Maschine hier das Ergebnis.
IF Variante: 4.8 Sekunden
Switch Variante: 2.2 Sekunden

Gehen wir einen Schritt weiter. Vergleiche in PHP erledigt man in in der Regel mit zwei hintereinander gestellten Gleichheitszeichen (Vergleichsoperator), also

PHP:

  1. if ($heute==‘Monday’) $resttage = 5;

PHP ist nicht typensicher – Seit PHP4 kann man auch den Vergleichsoperator === benutzen.
Dieser besagt, dass beide Variablen die gleichen Werte beeinhalten und der Typ (Integer, Double, String etc.) beider Variablen identisch sein muss. Also es werden nicht nur Werte sondern auch Typen verglichen.

Wenn wir unsere IF Variante modifizieren.
IF Variante mit ===

PHP:

  1. <?
  2. //IF Variante
  3. function timer_stop() {
  4. global $timestart, $timeend;
  5. $mtime = microtime();
  6. $mtime = explode(‘ ‘,$mtime);
  7. $mtime = $mtime[1] + $mtime[0];
  8. $timeend = $mtime;
  9. $timetotal = $timeend-$timestart;
  10. return number_format($timetotal,5);
  11. }
  12. function timer_start() {
  13. global $timestart;
  14. $mtime = explode(‘ ‘, microtime() );
  15. $mtime = $mtime[1] + $mtime[0];
  16. $timestart = $mtime;
  17. return true;
  18. }
  19. timer_start();
  20. $heute = date(“l”);
  21. for ($i=0; $i<1000000; $i++) {
  22. if ($heute===‘Monday’) $resttage = 5;
  23. if ($heute===‘Tuesday’) $resttage = 4;
  24. if ($heute===‘Wednesday’) $resttage = 3;
  25. if ($heute===‘Thursday’) $resttage = 2;
  26. if ($heute===‘Friday’) $resttage = 1;
  27. if ($heute===‘Saturday’) $resttage = 0;
  28. if ($heute===‘Sunday’) $resttage = 6;
  29. }
  30. echo ‘IF Variante<br/>’;
  31. echo ‘Bis Samstag sind es noch ‘.$resttage.‘ Tage<br/>’;
  32. echo ‘Ladezeit:’. timer_stop();
  33. ?>

erreichen wir eine durschnitlliche Lade-/Verarbeitungszeit von 2.8 Sekunden.

Kann man die Switch Variante ähnlich optimieren?
Es gibt die Möglichkeit die Kurzfassung der Switch Kontrollstruktur zu benutzen. Dafür schreiben wir unser Script ein wenig um.

PHP:

  1. <?
  2. //Switch Kurzfassung Variante
  3. function timer_stop() {
  4. global $timestart, $timeend;
  5. $mtime = microtime();
  6. $mtime = explode(‘ ‘,$mtime);
  7. $mtime = $mtime[1] + $mtime[0];
  8. $timeend = $mtime;
  9. $timetotal = $timeend-$timestart;
  10. return number_format($timetotal,5);
  11. }
  12. function timer_start() {
  13. global $timestart;
  14. $mtime = explode(‘ ‘, microtime() );
  15. $mtime = $mtime[1] + $mtime[0];
  16. $timestart = $mtime;
  17. return true;
  18. }
  19. timer_start();
  20. $heute = date(“w”);
  21. for ($i=0; $i<1000000; $i++) {
  22. $resttage = (6-$heute>= 0) ? 6-$heute : 6;
  23. }
  24. echo ‘Switch Kurzfassung<br/>’;
  25. echo ‘Bis Samstag sind es noch ‘.$resttage.‘ Tage<br/>’;
  26. echo ‘Ladezeit:’. timer_stop();
  27. ?>

Ergebnis: 1.9 Sekunden.

Vergleich aller Varianten
IF==:4.8 Sekunden
IF===:2.8 Sekunden
Switch :2.2 Sekunden
Switch Kurzfassung:1.9 Sekunden

Fazit: Wie man sieht gibt es viele Möglichkeiten seinen Code zu optimieren. Je nach Aufgabenstellung sollte man den “optimalen” Code schreiben und auch intensiv testen!!! Erst dann wird man wie im o.g. Beispiel leichte bis grosse Unterschiede feststellen können. Ein guter Programmier testet seinen Code auch in Bezug auf Performance.

ähnliche Beiträge:

Wenn dir unser Beitrag gefallen hat, setze doch einen Link auf diesen Beitrag. Hier ein Code Beispiel:

<a href="http://danielkeppler.com/2008/php-was-ist-schneller-if-oder-switch/">PHP: Was ist schneller – IF oder Switch?</a>

Leave a Reply