[MEMORY] Speicherverbrauch durch String-Verkettung

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

[MEMORY] Speicherverbrauch durch String-Verkettung

Beitrag von MrNiceGuy » 10.03.2013, 08:18:55

Moin moin!

Ich weiß, ich bin gerade nicht so aktiv, aber ich habe gerade einen sehr interessanten Blog-Eintrag gelesen:

http://irishado.blogspot.co.uk/2013/03/ ... -than.html

Bei diesem Eintrag geht es zwar augenscheinlich um den Vergleich von print() vs. echo(), jedoch ist der eigentliche Punkt die Verwendung von String-Verkettungen bei Ausgabe von Informationen. Knackpunkt ist - und das halte ich erst einmal für schlüssig -, dass bei der String-Verkettung deutlich mehr Speicher verbraucht wird. Das angebrachte Beispiel halte ich für sehr gut und leicht verständlich. Ich selber nutzte bisher häufig diese Art der Ausgabe, werde das jetzt aber gründlich überdenken.

Insgesamt bleibt eigentlich zu sagen, dass in dem Blog darauf hingewiesen wird, dass Ausgaben in Form von:

Code: Alles auswählen

echo $a . " " . $b;
durch folgende Schreibweise ersetzt werden sollten:

Code: Alles auswählen

echo $a , " " , $b;
Für mich war das bisher neu bzw. ich hatte mir bislang keine Gedanken darüber gemacht, aber bei der Verwendung größerer Strings kann das vielleicht doch sehr schnell zu einem Problem werden. Gerade wenn ich darüber nachdenke, dass ich bisher SQL-Statements immer mal über mehrere Zeilen verbaut habe und diese Zeilenweise verkettet habe... *ohoh*

Darüber hinaus soll es ja nicht bedeuten, dass man die String-Verkettung nicht benutzen soll, manchmal geht es ja nicht anders. Für mich ergibt sich jetzt jedoch eine weitere Frage: Was wäre jetzt sinnvoller:

Code: Alles auswählen

$a = $b . " " . $c;
oder

Code: Alles auswählen

$a = "$b $c";
?

Vermutlich würde letztere Variante dann auch weniger Speicher verbrauchen?!

Ich versuche das mal in einem Beispiel-Script zu testen, allerdings bin ich nicht sicher, wie genau die Angaben zum Speicherverbrauch wirklich sind...
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: [MEMORY] Speicherverbrauch durch String-Verkettung

Beitrag von dr.e. » 10.03.2013, 12:50:22

Hallo Lutz,

sehr interessanter Artikel!

Code: Alles auswählen

$a = "$b $c";
Hinsichtlich des Speichers ist vermutlich diese Variante besser, gemessen an der Performance eher

Code: Alles auswählen

$a = $b. ' ' . $c;
(einfache Quotes!)
Ich versuche das mal in einem Beispiel-Script zu testen, allerdings bin ich nicht sicher, wie genau die Angaben zum Speicherverbrauch wirklich sind...
Hier könnte das xdebug-Profiling sicher helfen. Dort siehst du welche Funktion, welche Zeit und welchen Speicherverbrauch hat.
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [MEMORY] Speicherverbrauch durch String-Verkettung

Beitrag von MrNiceGuy » 13.03.2013, 09:09:41

Hi Christian,

kannst du mir zu den xdebug nähere Informationen zukommen lassen? Leider sind die Angaben aus memory_get_usage() deutlich zu ungenau und zeigen eigentlich - trotz deaktivierter GC - die selben Resultate, das kann aber eigentlich nicht sein.
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: [MEMORY] Speicherverbrauch durch String-Verkettung

Beitrag von dr.e. » 13.03.2013, 15:11:16

Hab das nochmal nachgelesen. Dachte, dass der Profiler von xdebug auch den Memory-Verbrauch anzeigt, tut er aber leider nicht. :(
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [MEMORY] Speicherverbrauch durch String-Verkettung

Beitrag von MrNiceGuy » 13.03.2013, 20:05:20

Schade :( Habe auch kurz mit dem Autor des Artikels gesprochen: Er hat auch keine Messung vorgenommen, sondern lediglich einen theoretischen Artikel über die Verarbeitungsreihenfolge innerhalb des Interpreten verfasst. Demnach werden halt auch Berechnungen wie $a = 1 + 2 + 3 + 4 + 5; so verarbeitet, als würde es eine Art Schleifendurchlauf geben und $a der Reihe nach die Werte 1, 3, 6, 10 und 15 zugewiesen.

Dennoch ein interessantes Thema. Jetzt stellt sich mir die Frage, ob es im APF irgendwo derartigen Code geben könnte, aber ich glaube so viele echos gibt es im APF nicht!?
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: [MEMORY] Speicherverbrauch durch String-Verkettung

Beitrag von MrNiceGuy » 13.03.2013, 20:08:02

Achja, BTW: Die Variante mit $a = "$b $c"; verbraucht insgesamt mehr Speicher, als $a = $b . ' ' . $c;, jedoch ist der Unterschied VOR und NACH der Anweisung bei beiden identisch. Es kann also nur so sein, dass aus dem Konstrukt "$b $c" intern mehr Speicher verbraucht wird, als für $b . ' ' . $c - also ich meine nicht der Inhalt des Ausdrucks, sondern den Ausdruck als solches, vor der Verarbeitung. Die Differenz lag - unabhängig von der Größe der Variablen $b und $c bei 88 Bytes.
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: [MEMORY] Speicherverbrauch durch String-Verkettung

Beitrag von dr.e. » 14.03.2013, 00:13:17

Hi Lutz,
Dennoch ein interessantes Thema. Jetzt stellt sich mir die Frage, ob es im APF irgendwo derartigen Code geben könnte, aber ich glaube so viele echos gibt es im APF nicht!?
Das APF hat im Wesentlichen überhaupt kein echo. Das echo kommt in deiner index.php dazu, wenn du den Rückgabe-Wert des Front-Controllers ausgibst.
Achja, BTW: Die Variante mit $a = "$b $c"; verbraucht insgesamt mehr Speicher, als $a = $b . ' ' . $c;, jedoch ist der Unterschied VOR und NACH der Anweisung bei beiden identisch. Es kann also nur so sein, dass aus dem Konstrukt "$b $c" intern mehr Speicher verbraucht wird, als für $b . ' ' . $c - also ich meine nicht der Inhalt des Ausdrucks, sondern den Ausdruck als solches, vor der Verarbeitung. Die Differenz lag - unabhängig von der Größe der Variablen $b und $c bei 88 Bytes.
Das hatte ich tatsächlich so nicht vermutet - interessant! :) Dann sollte das APF dahingehend schon sehr gut optimiert sein, denn die String-Erzeugung setzt ausschließlich auf einfache Anführungszeichen und Konkatinierung.
Viele Grüße,
Christian

Antworten