Funktionen oder iterative Programmierung?

Wie in allen Programmiersprachen, die Funktionen unterstützen, gilt auch in PHP, dass man keine Codeblöcke einfach von einem Script in ein anderes kopieren sollte. Ich höre Stimmen: „Aber ich brauche diesen Block doch in beiden Scripten“.
Meine Antwort: „Richtig, dagegen ist auch nichts einzuwenden. Aber du brauchst den Code nicht 2 mal.“

Dieser Dialog zielt darauf ab, dass es Funktionen gibt und diese sollte man auch nutzen – und am besten effektiv nutzen. Leider gibt es nämlich auch das Gegenteil zu den in diesem Artikel beschriebenen Entwicklern: solche, die fast vollständig ohne Funktionen auskommen und lieber iterativ von der ersten bis zur letzten Zeile vorgehen. Was ist nun besser?

Funktionen, die in mehreren Dateien vorkommen, sollte man in einer Funktionendatei unterbringen, die man dann in die Scripte per include() einfügen kann, wo sie benötigt werden.
Das Problem an einer solchen Funktionendatei ist, dass der include()-Befehl ausgeführt werden muss und alle in der eingefügten Datei enthaltenen Funktionen interpretiert werden müssen. Es ist also bequem mit Funktionen zu programmieren – ohne Frage.

Da dieser Blog allerdings nicht „PHP Möglichst bequem“ sondern „PHP Performance“ heißt, möchte ich auf die Möglichkeit verweisen, Funktionen nicht zu verwenden, wenn man wirklich jedes Quentchen Performance aus seiner Anwendung holen möchte.
Ich hab da mal was vorbereitet:

function getName() {
  return "Jan";
}
 
function getBeitraege() {
  return array("Test 1","Test 2","Test 3");
}
 
function formatBeitraege($arr) {
  $str = "";
  foreach($arr as $beitrag) {
    $str .= $beitrag."<br />";
  }
  return $str;
}
 
echo getName();
echo "Neue Beiträge für dich:<br />";
echo formatBeitraege(getBeitraege());

Dieses Script arbeitet mit Funktionen. Als Gegner tritt folgendes Script an, das iterativ vorgeht:

$name = "Jan";
$beitraege = array("Test 1","Test 2","Test 3");
 
echo "Hallo ".$name;
echo "Neue Beiträge für dich:<br />";
foreach($beitraege as $beitrag) {
  echo $beitrag."<br />";
}

Beide Scripte arbeiten mit vorgegebenen Daten. In der Praxis würden die Daten bei dem funktionsorientierten Script innerhalb der Funktionen aus der Datenbank geholt bzw. beim iterativen direkt die Queries in der Zeile geschrieben, in der sie benötigt werden.

Auswertung
Als Ergebnis erhält man folgendes:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
result_ausgabe_
iterativ.php
12.748331 s 1.275 ms 100 %
result_ausgabe_
funktionen.php
13.639613 s 1.364 ms 107 % (+ 7%)

Die iterative Methode ist in diesem Fall durchaus schneller. Allerdings wird ein großes Script durch solche Aktionen schnell unübersichtlich. Deshalb kann ich diese Methode nur für PHP-Scripte empfehlen, die wirklich auf jedes Quentchen Geschwindigkeit achten müssen.

Jan hat 152 Beiträge geschrieben

4 Kommentare zu “Funktionen oder iterative Programmierung?

  1. A. Rust sagt:

    Hallo,

    generell sollte man bedenken, dass beide Ansätze nicht auf Wartbarkeit abzielen und für software engineers unpraktikabel sind. OOP ist der Schlüssel zu einer zwar geringfügig langsameren Verarbeitung, jedoch zu einer wesentlich übersichtlicheren Darstellung und Verwendung in Teams, komponenten- sowie modulorientierung. Das zeigt die Praxis. Enterprise-Software wird niemals funktional oder iterativ programmiert.

    Mit Aufkommen der Multiprozessorsysteme ist die „Funktionale Programmierung“ allerdings eine zukunftsweisende Technologie, da der OOP-Ansatz hier im Wege steht.

    LG

    André

  2. Sebastian sagt:

    Etwas out of Topic:
    @André

    Hast du zu der Aussage mit dem OOP-Ansatz und den Multiprozesorsystemen eine Quelle?

    Danke und viele Grüße
    Sebastian

  3. David sagt:

    Die Notation „“ schränkt schon so stark ein, daß man nur X(HT)ML verwenden kann, eleganter läßt sich das mit „nl2br(PHP_EOL,$is_xhtml)“ lösen.
    Allerdings zeigt die Inline-Notation von XHTML ein ganz anderes Problem auf, das schon bei Projekten sehr geringer Größe Bedeutsamkeit erreicht:
    1) Daten müßen geprüft, abgeglichen und formatiert werden.
    2) Sämtliche Datenzugriffe, -Manipulationen und -Prüfungen sollten nach Möglichkeit nur an einer Stelle erfolgen, daher sind einzeln notierte Funktionen oder Klassen notwendig. Nur so kann (ggf. neben Konstanten)sichergestellt werden, daß die Ergebnisse von Berechnungen gleich und Kompatibel sind. Der Wartungsaufwand für Projekte steigt unverhältnismäßig, wenn die gleiche Funktionalität jeweils an mehreren Stellen angepasst werden muß.

    Darüber hinaussollte das eigentliche Interesse einer anderen Entscheidung zukommen:
    Werden Schleifen iterativ oder rekursiv bearbeitet?
    Beide Möglichkeiten können interne Funktionsaufrufe beinhalten um Daten zu erhalten, dennoch gibt es meines Wissens im Hinblick auf Speicherverbrauch Unterschiede.
    Die rekursive Lösung ist meistens etwas übersichtlicher, dafür sind iterative Lösungen im Speicherverbrauch sparsamer.
    Diese Entscheidung steht immer dann an, wenn ein Schritt mehrmals ausgeführt werden muss, und dies ist fast IMMER der Fall, auch in OOP!

    Sicherlich ist das Benchmarking im oben genannten Beispiel interessant und sollte zumindest darauf hinweisen, daß eine zu starke Aufteilung in unterschiedliche Funktionen kontraproduktiv sein kann, jedoch sollte NICHT darauf geschlossen werden, daß alle Skripts nun an einem Stück notiert werden sollten.

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>