Array-Auswertung optimieren
php_anfänger
- php
0 Don P0 ChrisB0 Der-Dennis0 ChrisB
0 Sven Rautenberg
1 Sven Rautenberg
Hallo alle zusammen
Ich habe folgenden Test-Code für die Ausgabe geschrieben:
<form action="test.php" method="post">
<table>
<?php
for ($i=1; $i<5; $i++) {
$_POST['ID'] = $i;
echo "<tr>";
echo "<td>";
echo "ID: {$_POST['ID']} ";
echo "Bewertung: <input type=\"checkbox\" name=\"ImgRating[".$_POST['ID']."]\" value=\"ImgRatingActivated\" />";
echo "Kommentare: <input type=\"checkbox\" name=\"ImgComments[".$_POST['ID']."]\" value=\"ImgCommentsActivated\" />";
echo "Anzeigen: <input type=\"checkbox\" name=\"ImgView[".$_POST['ID']."]\" value=\"ImgViewActivated\" />";
echo "</td>";
echo "</tr>";
}
?>
<tr>
<td>
<input type="submit" name="formUpdateSubmit" value="speichern" />
</td>
</tr>
</table>
</form>
Dieser Code soll eine Datenbank-Ausgabe darstellen, wie es in der finalen Version der Fall sein wird.
Der oben ausgegebene Code wird mit folgendem Code ausgewertet:
<?php
if (isset($_POST['formUpdateSubmit'])) {
if (!empty($_POST['ImgRating'])) {
foreach ($_POST['ImgRating'] as $key => $value) {
echo $key;
echo $value;
}
}
if (!empty($_POST['ImgComments'])) {
foreach ($_POST['ImgComments'] as $key => $value) {
echo $key;
echo $value;
}
}
if (!empty($_POST['ImgView'])) {
foreach ($_POST['ImgView'] as $key => $value) {
echo $key;
echo $value;
}
}
}
?>
Die Ausertung funktioniert auch so wie ich will, ich fragte mich nur, ob es eine profesioneller Lösung für die Auswertung gibt. Ich denke die 3 Foreach's könnte man auch irgendwie zusammenfassen in einem Array o.ä. aber leider habe ich keine Idee und ich möchte diesen Code unbedingt optimieren.
Wenn mir jemand helfen könnte wäre ich sehr dankbar.
mfg: php_anfänger
Hallo,
leider habe ich keine Idee und ich möchte diesen Code unbedingt optimieren.
Inwiefern optimieren:
Kenne zwar PHP kaum, aber der wiederholte Zugriff auf das dasselbe Array-Element dürfte performanter laufen, wenn man eine Referenz darauf zwischenspeichert. Geht das in PHP überhaupt?
Kann mir auch vorstellen, dass du auf die empty-Abfragen verzichten kannst, foreach macht dann halt nichts, wenn das Ding leer ist. Kann aber sein, dass foreach einen Fehler wirft, wenn man ihm keine Liste übergibt. Das könntest du mal abklären, falls nicht schon geschehen.
In manchen Sprachen (z.B. C#) ist foreach auch langsamer als for, weil es mehr Möglichkeiten mitbringt und daher mehr Overhead braucht. Vielleicht ist das in PHP auch so?
Wenn immer man wiederholt auf etwas wie bli.bla.blubb zugreifen muss, ist es z.B. in JavaScript besser, das Ding vorab zu speichern: (var bliblablubb = bli.bla.blubb;
) und dann mit dem zwischengespeicherten Wert zu arbeiten. Leicht möglich, dass das auch für PHP gilt.
Sorry, dass ich keine genaueren Angaben machen kann.
Gruß, Don P
Hi,
Kenne zwar PHP kaum, aber der wiederholte Zugriff auf das dasselbe Array-Element dürfte performanter laufen, wenn man eine Referenz darauf zwischenspeichert. Geht das in PHP überhaupt?
PHP kennt zwar auch Referenzen - aber der Geschwindigkeitsvorteil dürfte sich hier so stark in Grenzen halten, dass eine solche „Optimierung“ nichts bringt, aber den Code schwerer nachzuvollziehen macht.
Kann mir auch vorstellen, dass du auf die empty-Abfragen verzichten kannst, foreach macht dann halt nichts, wenn das Ding leer ist. Kann aber sein, dass foreach einen Fehler wirft, wenn man ihm keine Liste übergibt.
Ja, dann meckert foreach. Von aussen kommende Werte sollte man deshalb mit is_array() vorher prüfen.
In manchen Sprachen (z.B. C#) ist foreach auch langsamer als for, weil es mehr Möglichkeiten mitbringt und daher mehr Overhead braucht. Vielleicht ist das in PHP auch so?
Siehe oben - auch kaum relevant.
Wenn immer man wiederholt auf etwas wie bli.bla.blubb zugreifen muss, ist es z.B. in JavaScript besser, das Ding vorab zu speichern: (
var bliblablubb = bli.bla.blubb;
) und dann mit dem zwischengespeicherten Wert zu arbeiten. Leicht möglich, dass das auch für PHP gilt.
Nein, eher nicht.
Bei JavaScript sind solche Mikro-Optimierungen oftmals sinnvoll, wenn bspw. die Berechnungen des Codes sich gleich sichtbar auswirken.
In PHP hingegen ist das alles nicht von Belang - da gilt auf jeden Fall gut lesbarer Code vor Mikro-Optimierungen, die allerhöchstens im Millisekunden-Bereich was bringen, und auch das oft nur dann, wenn der Code in einer Schleife Tausende Male hintereinander ausgeführt wird.
MfG ChrisB
Kann mir auch vorstellen, dass du auf die empty-Abfragen verzichten kannst, foreach macht dann halt nichts, wenn das Ding leer ist. Kann aber sein, dass foreach einen Fehler wirft, wenn man ihm keine Liste übergibt.
Ja, dann meckert foreach. Von aussen kommende Werte sollte man deshalb mit is_array() vorher prüfen.
Ist grundsätzlich richtig, nur in diesem Fall nicht unbedingt, da immer ein Array übergeben wird, z.B.:
ImgRating[".$_POST['ID']."]
Ansonsten versteh ich noch nicht so ganz, was da optimiert werden soll?
Gruß, Dennis
Hi,
Ja, dann meckert foreach. Von aussen kommende Werte sollte man deshalb mit is_array() vorher prüfen.
Ist grundsätzlich richtig, nur in diesem Fall nicht unbedingt, da immer ein Array übergeben wird, z.B.:
ImgRating[".$_POST['ID']."]
Vorher hattest du noch explizit $_POST['ImgRating'] geschrieben.
Und dass das immer ein Array ist, ist absolut nicht gesagt. (Es wäre extrem naiv anzunehmen, Requests an dein Script müssten immer „von“ deinem Formular kommen. Die können sonst woher kommen - es muss noch nicht einmal das im Spiel sein, was du einen „Browser“ nennen würdest.)
Ansonsten versteh ich noch nicht so ganz, was da optimiert werden soll?
Die Qualität und Robustheit deines Scriptes.
Dass Optimierung auf Geschwindigkeit, was solchen Kleinkram angeht, in Sachen PHP reichlich nutzlos ist, schrieb ich bereits in meiner Antwort davor.
MfG ChrisB
Vorher hattest du noch explizit $_POST['ImgRating'] geschrieben.
Und dass das immer ein Array ist, ist absolut nicht gesagt. (Es wäre extrem naiv anzunehmen, Requests an dein Script müssten immer „von“ deinem Formular kommen. Die können sonst woher kommen - es muss noch nicht einmal das im Spiel sein, was du einen „Browser“ nennen würdest.)
Ich glaube Du verwechselst mich da grade. Das ist mein erster Beitrag zu diesem Thema gewesen und nicht mein Skript.
Ich meinte auch nur, dass in diesem Fall, also bei dem Formular des Fragenstellers, immer ein Array übergeben wird.
Ansonsten stimmt natürlich, was Du sagst. Formulardaten müssen immer überprüft werden.
Ansonsten versteh ich noch nicht so ganz, was da optimiert werden soll?
Die Qualität und Robustheit deines Scriptes.
Dass Optimierung auf Geschwindigkeit, was solchen Kleinkram angeht, in Sachen PHP reichlich nutzlos ist, schrieb ich bereits in meiner Antwort davor.
Ja, insgesamt ist mir bewusst, was Optimierung ist. Nur halt nicht in diesem Fall ;-)
Gruß, Dennis
Moin!
Kenne zwar PHP kaum, aber der wiederholte Zugriff auf das dasselbe Array-Element dürfte performanter laufen, wenn man eine Referenz darauf zwischenspeichert. Geht das in PHP überhaupt?
Sowas gibt es, macht den Code aber komplizierter, und hilft nicht wahrnehmbar.
Kann mir auch vorstellen, dass du auf die empty-Abfragen verzichten kannst, foreach macht dann halt nichts, wenn das Ding leer ist. Kann aber sein, dass foreach einen Fehler wirft, wenn man ihm keine Liste übergibt. Das könntest du mal abklären, falls nicht schon geschehen.
Stimmt nicht. foreach auf ein leeres Array angewandt läuft 0 mal durch. foreach auf ein Nicht-Array angewandt ergibt ein Warning.
In manchen Sprachen (z.B. C#) ist foreach auch langsamer als for, weil es mehr Möglichkeiten mitbringt und daher mehr Overhead braucht. Vielleicht ist das in PHP auch so?
Falsch, foreach ist in PHP schneller als for.
Wenn immer man wiederholt auf etwas wie bli.bla.blubb zugreifen muss, ist es z.B. in JavaScript besser, das Ding vorab zu speichern: (
var bliblablubb = bli.bla.blubb;
) und dann mit dem zwischengespeicherten Wert zu arbeiten. Leicht möglich, dass das auch für PHP gilt.Sorry, dass ich keine genaueren Angaben machen kann.
Du erzeugst viele Gerüchte, von denen einige für PHP falsch sind, und hilfst insgesamt dem Vorankommen des Themas nicht wirklich weiter. Wenigstens steht dabei, dass du von PHP im Detail keine Ahnung hast. ;)
- Sven Rautenberg
Hallo,
Du erzeugst viele Gerüchte, von denen einige für PHP falsch sind, und hilfst insgesamt dem Vorankommen des Themas nicht wirklich weiter.
Es sah so aus, als ob sonst keiner antworten will, und ich habe nur ein paar Ideen geliefert, weil es hieß
» leider habe ich keine Idee
Erst seit meinem Beitrag ist der Thread überhaupt angelaufen.
» Wenigstens steht dabei, dass du von PHP im Detail keine Ahnung hast. ;)
Genau, und das hat sich jetzt schon bisschen gebessert, weil man ja zu meinen Thesen Stellung genommen hat.
Viele Mikrooptimierungen im Millisekundenbereich ergeben übrigens auch mal Sekunden, und diese summieren sich zu Minuten und Stunden...
Gruß, Don P
Moin!
Viele Mikrooptimierungen im Millisekundenbereich ergeben übrigens auch mal Sekunden, und diese summieren sich zu Minuten und Stunden...
Das ist richtig, allerdings kosten solche Optimierungen in der Regel deutlich mehr Arbeitsaufwand, als die Bereitstellung zusätzlicher CPU-Power.
Nichts gegen Optimierungen. Jeder Code, der langsam läuft, aber schneller sein sollte, kann in einem ersten Schritt erstmal grob untersucht und auf auffällige Bremsen geprüft werden. Und solche Bremsen kann man in der Regel auch recht leicht entfernen. Das ist aber keine Mikrooptimierung.
Ab einem gewissen Grad von Aufwand für das Suchen und Ersetzen von langsamen Stellen wird dieser Vorgang aber teurer, als man jemals Geld mit der gewonnenen Performance einsparen könnte.
- Sven Rautenberg
Hallo,
Ab einem gewissen Grad von Aufwand für das Suchen und Ersetzen von langsamen Stellen wird dieser Vorgang aber teurer, als man jemals Geld mit der gewonnenen Performance einsparen könnte.
An Geld habe ich dabei gar nicht gedacht. Es geht ums Prinzip. Eine Mikrooptimierung für Code, der vielleicht 100 mal täglich läuft, kann man sich wirklich sparen. Aber breits dann, wenn er 100mal unmittelbar direkt in Folge läuft, ist es eine Überlegung wert, auch wenn das dann nur 1 mal täglich passiert: 100 * 10ms = 1 Sekunde, was durchaus spürbar ist.
Wenn man schon beim Schreiben von neuem Code weiß, dass die eine oder andere Art einfach schneller geht, dann ist es doch besser, man wählt gleich die optimalere Lösung. Dann muss man auch nicht im nachhinein alle Stellen suchen und umschreiben.
Besonders in Schleifen wird jede kleine Optimierung bald spürbar, weil sich eben die kleine Bremswirkung von langsamerem Code mit jedem Durchlauf aufsummiert. Ich behaupte einfach, dass das genrell gilt, auch für PHP, und dass das anscheinend oft unterschätzt wird. Was sind schon 4 oder 5 Millisekunden? Einzeln ist das natürlich fast nichts, aber die Masse macht's...
Gruß, Don P
Hi,
Es geht ums Prinzip. Eine Mikrooptimierung für Code, der vielleicht 100 mal täglich läuft, kann man sich wirklich sparen. Aber breits dann, wenn er 100mal unmittelbar direkt in Folge läuft, ist es eine Überlegung wert, auch wenn das dann nur 1 mal täglich passiert: 100 * 10ms = 1 Sekunde, was durchaus spürbar ist.
Mikro-Optimierung holt aber keine Zehn Millisekunden irgendwo raus.
Heutige (Server-)Prozessoren erreichen MIPS-Werte im vier- oder fünfstelligen Bereich.
Wenn du da eine Mikro-Optimierung in deinem Code vornimmst, die vielleicht eine handvoll Rechenoperationen einspart, merkst du davon überhaupt nichts.
MfG ChrisB
Hallo,
Mikro-Optimierung holt aber keine Zehn Millisekunden irgendwo raus.
Heutige (Server-)Prozessoren erreichen MIPS-Werte im vier- oder fünfstelligen Bereich.
Klar, wir entwickeln ja alle nur für modernste Server-Prozessoren ;)
Wieviele MIPS (Misleading Information to Promote Sales) setzt du denn für einen Zugriff auf ein Array-Element an, und wieviele für den Zugriff auf einen fixen Wert in einer Variablen? Ich denke, ein Faktor 5...10 ist da nicht unbedinbgt übertrieben. Man müsste es halt mal messen...
In JS habe ich einige solche Messungen gemacht, und z.B. die Ausführungszeit eines Scripts von 34 Min auf 2 Min gesenkt. Nicht *nur* mit Mikrooptimierungen, das ist klar, aber auch diese hatten einen guten Anteil daran.
Wenn du da eine Mikro-Optimierung in deinem Code vornimmst, die vielleicht eine handvoll Rechenoperationen einspart, merkst du davon überhaupt nichts.
Viele Hände voll ergeben auch bald eine volle Wanne... ich kann mich da nur wiederholen.
Gruß, Don P
Hi,
Klar, wir entwickeln ja alle nur für modernste Server-Prozessoren ;)
Von „modernst“ war keine Rede - sondern von aktuell.
Wieviele MIPS (Misleading Information to Promote Sales) setzt du denn für einen Zugriff auf ein Array-Element an, und wieviele für den Zugriff auf einen fixen Wert in einer Variablen?
Keine, höchstens eine handvoll I.
Ich denke, ein Faktor 5...10 ist da nicht unbedinbgt übertrieben.
Abgesehen davon, dass ich einen Faktor(!) 5-10 schon für übertrieben halte - es wird letztendlich nichts ausmachen, was sich für den Benutzer irgendwie bemerkbar macht.
In JS [...]
Dass das idR. ein vollkommen anderes Szenario ist, schrieb ich bereits.
Viele Hände voll ergeben auch bald eine volle Wanne... ich kann mich da nur wiederholen.
Ja, damit sind wir wieder beim altbekannten Muster - selbst wenn du sachliche Argumente vorgelegt bekommst, kannst du dich meist nur wiederholen :-)
MfG ChrisB
Moin!
Ich habe folgenden Test-Code für die Ausgabe geschrieben:
Den Code kann man schon mal recht einfach optimieren, indem man $_POST['ID'] weglässt, und direkt die Variable $i benutzt, die die Schleife anlegt.
<form action="test.php" method="post">
<table>
<?php
for ($i=1; $i<5; $i++) {// Das hier ist sinnlos: $_POST['ID'] = $i;
echo "<tr>";
echo "<td>";
echo "ID: $i ";
echo "Bewertung: <input type="checkbox" name="ImgRating[".$i."]" value="ImgRatingActivated" />";
echo "Kommentare: <input type="checkbox" name="ImgComments[".$i."]" value="ImgCommentsActivated" />";
echo "Anzeigen: <input type="checkbox" name="ImgView[".$i."]" value="ImgViewActivated" />";
echo "</td>";
echo "</tr>";
}
?>
<tr>
<td>
<input type="submit" name="formUpdateSubmit" value="speichern" />
</td>
</tr>
</table>
</form>
Wenn du hingegen die drei Input-Felder in EINEM gemeinsamen Array als Keys haben willst, wäre folgende Struktur für die Input-Namen besser:
name="img[$i][rating]", name="img[$i][comments]", name="img[$i][view]"
Und dein Code hier wäre dann:
> Der oben ausgegebene Code wird mit folgendem Code ausgewertet:
~~~php
<?php
if (isset($_POST['formUpdateSubmit'])) {
if (is_array($_POST['img'])) {
foreach ($_POST['img'] as $key => $value) {
echo $key;
echo $value['rating'];
echo $value['comments'];
echo $value['view'];
}
}
}
?>
Auf diese Weise ist das Resultat des auswertenden Codes deutlich lesbarer.
Wenn es darum geht, das Array hinterher auch noch in mehreren Arten zu sortieren, ist übrigens die umgekehrte Reihenfolge der Indices besser:
name="img[rating][$i]", name="img[comments][$i]", name="img[view][$i]"
<?php
if (isset($_POST['formUpdateSubmit'])) {
if (is_array($_POST['img'])) {
sort($_POST['img']['rating']); // sortieren nach rating!
// Ausgeben nach Rating
foreach ($_POST['img']['rating'] as $key => $value) {
echo $key;
echo $_POST['img']['rating'][$key];
echo $_POST['img']['comments'][$key];
echo $_POST['img']['view'][$key];
}
// Ausgeben nach View (unsortiert, andere Reihenfolge wie oben)
foreach ($_POST['img']['view'] as $key => $value) {
echo $key;
echo $_POST['img']['rating'][$key];
echo $_POST['img']['comments'][$key];
echo $_POST['img']['view'][$key];
}
}
}
?>
- Sven Rautenberg
Wenn du hingegen die drei Input-Felder in EINEM gemeinsamen Array als Keys haben willst, wäre folgende Struktur für die Input-Namen besser:
name="img[$i][rating]", name="img[$i][comments]", name="img[$i][view]"
Und dein Code hier wäre dann:
Der oben ausgegebene Code wird mit folgendem Code ausgewertet:
<?php
if (isset($_POST['formUpdateSubmit'])) {
if (is_array($_POST['img'])) {
foreach ($_POST['img'] as $key => $value) {
echo $key;
echo $value['rating'];
echo $value['comments'];
echo $value['view'];
}
}
}
?>
Danke Sven, genau sowas wollte ich wissen und an alle andere auch ein Dankeschön für die investierte Zeit.
mfg: php\_anfänger