Variablen in String einbetten oder konkatenieren

In PHP kann man Variablen auf zwei unterschiedliche Arten in einen String einbauen.

$zeit = time(); 
 // Variable im String  
echo "Der aktuelle UNIX-Timestamp ist $zeit."; 
   // Variable konkateniert  
echo "Der aktuelle UNIX-Timestamp ist ".$zeit.".";

Ich finde die zweite Variante sauberer, da sie die Variablen eindeutig vom String trennt, trotzdem möchte ich aber – nicht zuletzt angestoßen durch soulrebels Beitrag im Forum mal untersuchen, inwiefern sich beide Arten in der Performance unterscheiden.

Ich will nicht lang drumrumreden, sondern direkt das Ergebnis präsentieren:

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
var_out_of_ string.php 27.359341 s 2.736 ms 100%
var_out_of_ string_singlequote.php 27.759916 s 2.776 ms 101 % (+ 1%)
var_in_string.php 29.492408 s 2.949 ms 108 % (+ 8%)

Die Konkatenierungsvariante ist also nicht nur sauberer sondern auch schneller (wenn es auch kein wirklich großer Unterschied ist).

Nun, wodurch kommt das? Es ist nur eine Mutmaßung, aber ich kann mir vorstellen, dass jedes Zeichen des Strings einzeln untersucht werden muss und dadurch das Parsen mit einem regulären Ausdruck beim direkten Einbetten in den String länger dauert, denn der Parser weiß ja, wenn er auf $z stößt, erstmal noch nicht, ob der Variablenname danach noch weiter geht. Deshalb holt er sich Stück für Stück noch das e, i und t und stößt danach auf einen Punkt (.), der in PHP-Variablennamen nicht vorkommen darf. Erst dann weiß er, wie der Variablenname heißt – nämlich $zeit – und kann den Wert dieser Variablen an diese Stelle einbauen.

Wenn man die Variable an den String konkateniert, steht sofort für den Parser fest, welche Variable gemeint ist. Und genau da ist dann auch der Geschwindigkeitsunterschied begründet.

Also sowohl der besseren Lesbarkeit als auch der Geschwindiskeit wegen empfehle ich Variablen in Strings zu konkatenieren statt sie einzubetten.


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0