Raketenwilli: Überraschung: Konkatenieren ist deutlich schneller als Übergabe der Parts für echo

Beitrag lesen

Wir (hier im Forum) hatten genau das Thema schon mal (als PHP 7.2 neu war) und das Ergebnis hatte uns damals alle überrascht:

Zum selbst Testen:

<?php
# 1.php

$row["user"]="fritz";
$row["score"]=34;
$row["timestamp"]='2022-12-30';

for ($i=1;$i<100000;$i++) {
echo "user: ", $row["user"], " - score: ", $row["score"], " ", $row["timestamp"], "<br>";
}
<?php
#2.php

$row["user"]="fritz";
$row["score"]=34;
$row["timestamp"]='2022-12-30';

for ($i=1;$i<100000;$i++) {
echo "user: ". $row["user"]. " - score: ". $row["score"]. " ". $row["timestamp"]. "<br>";
}

Im Terminal ausgeführt (und die Ausgaben nach /dev/null umgeleitet) ist die Variante mit Konkatenierung stabil um den Faktor 3 schneller:

time 1.php > /dev/null
real	0m1,026s
user	0m0,523s
sys	0m0,472s


time 2.php > /dev/null
real	0m0,347s
user	0m0,126s
sys	0m0,186s

„Unverwässert“ durch z.b. ohne Zeiten für das Starten des Interpreters (user-time), wird sogar weniger als 1/4 der Zeit gebraucht. (Getestet auf Raspi4 mit PHP 8.2.0RC7 (cli) (built: Nov 26 2022 14:19:44) (NTS) )

Testsieger: Volles Konkatenieren des Outputs:

<?php
# 3.php

$row["user"]="fritz";
$row["score"]=34;
$row["timestamp"]='2022-12-30';

$out='';
for ($i=1;$i<100000;$i++) {
$out.="user: ". $row["user"]. " - score: ". $row["score"]. " ". $row["timestamp"]. "<br>";
}
echo $out;
time 3.php > /dev/null
real	0m0,197s
user	0m0,086s
sys	0m0,074s

Letzte Mikrooptimierung: Ersparen des Nachsehens, ob in den Strings etwas ersetzt werden muss ("'):

<?php
# 4.php

$row["user"]="fritz";
$row["score"]=34;
$row["timestamp"]='2022-12-30';


$out='';
for ($i=1;$i<100000;$i++) {
$out.='user: '. $row['user']. ' - score: '. $row['score']. ' '. $row['timestamp']. '<br>';
}
echo $out;
time 4.php > /dev/null
real	0m0,192s
user	0m0,109s
sys	0m0,055s