Funktionsaufruf per Referenz

In den meisten PHP-Anwendung gibt es Funktionen (oder bei OOP Methoden). Diese können Parameter als Eingabewerte empfangen. Nun gibt es – wie in den meisten Programmiersprachen – in PHP den Aufruf per call-by-value und call-by-reference. Der Unterschied ist, dass bei call-by-value das zu übergebende Objekt ausgelesen und in eine neue (lokale) Variable gespeichert wird, mit der dann innerhalb der Funktion gearbeitet werden kann.
Bei call-by-reference wird nicht der Inhalt übergeben sondern lediglich ein Zeiger auf eine bestimmte Variable. Das spart jede Menge Speicherplatz, da die Daten nur einmal im Speicher sein müssen, während die gleichen Daten bei call-by-value sowohl in der übergebenen Variable als auch in der lokalen Variable in der Funktion stehen.
Wirklich interessant ist das vor allem bei der Übergabe von Arrays und Objekten an eine Funktion, da diese recht speicherintensiv sind. Bei Zahlen und Strings braucht das hier gesagte eher weniger angewendet zu werden.
In PHP sehen die Varianten so aus:

$numberArray = array();
for($i=0;$i<10000;$i++) {
  $numberArray[] = $i;
}
 
// Funktion, die per call-by-value aufgerufen wird
function array_calc($arr) {
  $cnt_arr = count($arr)-1;
  for($i=$cnt_arr;$i>0;$i--) {
    $arr[$i] = $arr[$i] * $arr[$i-1];
  }
  return $arr;
}
 
// call-by-value Aufruf
$numberArray = array_calc($numberArray);
 
// Funktion, die per call-by-reference aufgerufen wird
function array_calc(&$arr) {
  $cnt_arr = count($arr)-1;
  for($i=$cnt_arr;$i>0;$i--) {
    $arr[$i] = $arr[$i] * $arr[$i-1];
  }
}
 
// call-by-reference-Aufruf
array_calc($numberArray);

Der Unterschied ist das „&“ vor dem Parameternamen bei der Referenz-Variante. Außerdem wird bei dieser Variante kein Rückgabewert benötigt, da das übergebene Array direkt bearbeitet wird. Daran sieht man, dass, falls die Daten innerhalb der Funktion verändert werden, der Referenzaufruf nur dann SInn macht, wenn die ursprünglichen Daten des Arrays oder Objektes nicht mehr benötigt werden. Falls sie nur zum Auslesen benötigt werden, ist call-by-reference auf jeden Fall sinnvoll.

Die Auswertung
Für ein Array mit 10000 Einträgen wurde das ganze verglichen.

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
result_function_
call_by_reference.php
158.137390 s 15.814 ms 100 %
result_function_
call_by_value.php
174.120373 s 17.412 ms 110 % (+10 %)

Diese Scripte wurde lokal getestet, wo genug Speicher vorhanden ist und nicht gleichzeitig mehrere Besucher die gleiche Datei anfordern. Im Internet sollte sich die Schere zwischen Referenz- und Wert-Funktion noch vergrößern.
Deshalb empfehle ich, bei Funktionsaufrufen mit großen Objekten oder Arrays – wenn möglich – den Parameter per call-by-reference zu übergeben.

Quellcodes
Benchmark-Ergebnisse

Jan hat 152 Beiträge geschrieben

Ein Kommentar zu “Funktionsaufruf per Referenz

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>