Daten für Funktion mit oder ohne Übergabe
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
aufruf
auslese
beispiel
blatt
code
datum
definieren
file
funktion
kopieren
machen
original objekt
referenz
session
test
unterschied
url
zahl
zettel
-
Hallo
macht es einen (Performance) Unterschied,
ob ich $daten (z.B. mehrere KB großes Array)
im Funktionsaufruf übergebe oder als "globale" Variable nutze ?
und wenn ich in einer Funktion "große" Variablen verwenden möchte,
was ist dann besser ...
a) ... als global() in der Funktion definieren
b) ... als Session (vorher) anlegen
c) ... als Konstante (vorher) definieren
d) ... im Funktions-Aufruf übergeben
e) ... erst in Funktion Datenquelle auslesen
Beispiel:
$daten = file('liesmich.txt'); $anz = count($daten); if ($anz < 1) { echo "<p>Keine Daten vorhanden.</p>\n"; } else { echo "<p>" . zeige_daten ($anz) . "</p>\n"; } // --------------------------------------------- function zeige_daten ($anz) { global($daten); // oder als SESSION oder als KONSTANTE ??? $out = "Anzahl: ".$anz."\n"; $out .= "<br />----------------------------\n"; $i=1; foreach($daten as $item) { $out .= "<br />".$i." --- ".$item."\n"; $i++; } $out .= "<br />----------------------------\n"; return $out; } // ---------------------------------------------
oder mit Übergabe im Funktions-Aufruf
Beispiel:
$daten = file('liesmich.txt'); $anz = count($daten); if ($anz < 1) { echo "<p>Keine Daten vorhanden.</p>\n"; } else { echo "<p>" . zeige_daten ($daten, $anz) . "</p>\n"; } // --------------------------------------------- function zeige_daten ($daten, $anz) { $out = "Anzahl: ".$anz."\n"; $out .= "<br />----------------------------\n"; $i=1; foreach($daten as $item) { $out .= "<br />".$i." --- ".$item."\n"; $i++; } $out .= "<br />----------------------------\n"; return $out; } // ---------------------------------------------
macht das einen Unterschied,
... ob die $daten globa() definiert oder im Funktions-Aufruf übergeben werden ?
... oder wäre es als SESSION besser ... oder gar define() als KONSTANTE ??
Oder doch besser erst innerhalb der Funktion die $daten auslesen ?
$datenquelle = 'liesmich.txt'; echo "<p>" . zeige_daten ($datenquelle) . "</p>\n"; // --------------------------------------------- function zeige_daten ($datenquelle) { $daten = file($datenquelle); $anz = count($daten); if ($anz < 1) { $out = "Keine Daten vorhanden.\n"; } else { $out = "Anzahl: ".$anz."\n"; $out .= "<br />----------------------------\n"; $i=1; foreach($daten as $item) { $out .= "<br />".$i." --- ".$item."\n"; $i++; } $out .= "<br />----------------------------\n"; } return $out; } // ---------------------------------------------
oder macht das gar keinen Unterschied ?
Beitrag zuletzt geändert: 14.9.2012 13:38:29 von sportinfo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
du kannst ja die performance ermitteln, generell ist dann noch die frage wie oft die funktion called wird.
das ist ja nur logisch, eine abfrage oder viele.
also
ich meine
$a = file(x);
$b = file(x);
$c = file(x);
würde meiner meinung nach mehr performence als
$a = file(x);
$b = $a;
$c = $b;
kosten, daber garantieren will ichs dir lieber nicht... da teste es doch lieber mit memorypeak time und cpu last ;) -
Wenn du Daten an eine Funktion übergibst, dann werden diese in den Speicherbereich der Funktion kopiert. Dieses kann bei Großen Objekten ein arges Lagproblem sein. In PHP ist es dagegen eher weniger ein Problem, denn 10kb sind schnell kopiert (im Vergleich zu 10Mb).
Das mehrfach per file() auslesen ist das unperformanteste, das ist relativ klar. Denn hier hast du kein Kopieren im Ram, sondern einen direkten Speicherzugriff auf der Festplatte. Diese Aktion ist langsamer.
In eine Session gehören nur Daten rein, welche auch wirklich zur Session gehören. Denn diese werden auch in einer Datei gespeichert, und bei einem entsprechendem Aufruf der Session aus dieser Geladen. Ein ineffizienter zwischenspeicher.
Ein Array kannst du nicht in eine Konstante Packen. Du müsstest es erst Serialisieren, am besten in JSON packen, und das hin und her Parsen ist nicht gerade das beste, nicht die idealste Lösung.
global ist ein nettes Wort, welches nach einem gleichen Variablennamen in dem Globalen Space sucht, und hier dann eine Referenz setzt. Von den Möglichkeiten definitiv die beste. Doch es geht noch besser: Übergib selbst die Referenz.
function test( $daten ) { //arbeite mit $daten } $data = array( 'ganz' , ' viele' , 'daten' ); test( &$data );
Dabei übergibst du nur eine Referenz, das ist eine Adresse auf die original Daten. Das ist bei sehr großen Objekten definitiv am schnellsten. ABER: Änderungen die du in der Funktion an den Daten vornimmt, sind dann auch im globalen Space geändert. Beispiel:
function test( $daten ) { $daten += 5; } $zahl = 3; test( &$zahl ); echo $zahl;
wird 8 ausgeben, da das Original Objekt verändert wird. Das gleiche würde übrigens für global gelten.
Liebe Grüße -
ggamee schrieb:
function test( $daten ) { $daten += 5; } $zahl = 3; test( &$zahl ); echo $zahl;
wird 8 ausgeben, da das Original Objekt verändert wird. Das gleiche würde übrigens für global gelten.
Liebe Grüße
Das gibt Warnungen. Das & gehört in die Funktionsdefinition und nicht in den Funktionsaufruf.
function test( &$daten ) { $daten += 5; } $zahl = 3; test( $zahl ); echo $zahl;
http://de2.php.net/manual/de/language.references.pass.php -
chatter schrieb:
Das gibt Warnungen. Das & gehört in die Funktionsdefinition und nicht in den Funktionsaufruf.
Danke für die Korrektur, ich bring das immer durcheinander :)
Liebe Grüße -
sorry, aber fehlt da nich auch noch ein return in der Funktion ?
..... sonst wird ja nichts zurück gegeben ?!
function test( &$daten ) { $daten += 5; return $daten; } $zahl = 3; $ergebnis = test( $zahl ); echo $ergebnis;
oder geht das - wegen der Referenz & hier auch ohne return ?
(weil das Original Objekt verändert wird) .... ?
heisst das jetzt, Funktionsdefinition mit Referenz zu Variable als Parameter
ist gleich wie diese Variable als global (in der Funktion) zu definieren ?
... habe ich das richtig verstanden ?
Beitrag zuletzt geändert: 15.9.2012 9:15:40 von sportinfo -
Nein, kein Return gebraucht.
Stell dir mal so vor, du hast einen Zettel. Auf diesen schreibst du 3. Dann sollst du ihn Hans geben (der Funktion). Einmal, kannst du den Zettel für ihn Kopieren, dann kann er damit arbeiten, das ist seiner. Das ist der normale Funktionsaufruf, du macht eine Kopie für ihn. Du kannst aber auch sagen "der Zettel liegt in der 3ten Schublade oben", du gibst ene Referenz, wo der Zettel liegt. Dabei ist für Hans klar, dass er mit dem Zettel arbeiten darf, er darf andere Dinge raufschreiben usw usf. Aber er muss den Zettel da liegen lassen, damit du dannach weiter mit dem Zettel arbeiten kannst, egal ob was neues drauf steht. Es wird also mit dem Original gearbeitet, wenn du eine Referenz übergibst.
Das Return würde einen Wert, der raus kommt, im Speicher zur Kopie zur verfügung stellen, da wir aber mit dem Original arbeiten, wollen wir nichts kopieren. Veilleicht macht es das deutlicher.
Das Schlüsselwort "global", so kenne ich es, macht nichts anderes als eine Equivalente Variable zu suchen (vom Namen) und dann eine Referenz zu dieser zu legen. In diesem Fall sagst du Hans also "es gibt ein Blatt Namens "Zahl", aber ich sag dir nicht wo. Dann geht Hans los, sucht dieses Blatt in dem Schrank, und wenn er es findet, benutzt er das Original, wie oben. Da man aber erst suchen muss, ist das auch langsamer als direkt zu sagen, wo das Blatt ist.
Liebe Grüße -
ok. vielen Dank
ich glaube jetzt habe ich es verstanden,
mit Referenz in der Funktionsdefinition wird direkt das Original verändert
hatte mich nur gewundert, dass eine Funktion ohne return was "zurück gibt"
... aber jetzt ist es klar, sie muss in dem Fall nichts "zurück geben"
weil sie direkt das Original bearbeitet.
Danke für die Erklärung :)
Beitrag zuletzt geändert: 15.9.2012 10:06:27 von sportinfo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage