PHP’s Referenzen bremsen Web-Anwendungen aus
Posted: Januar 13, 2010 at 2:29 pm | Tags: optimieren, Optimierung, PHP, Referenz, Variable | PDFWas sich für viele erstmal total falsch anhört scheint aber doch wahr zu sein. Ich selbst habe bis heute auch Variablen, in denen ewig große Arrays gespeichert sind als Variaben übergeben, wenn ich wusste, dass der Inhalt nicht verändert wird. Einfach aus dem Gedanken, dass man dadurch Arbeitsspeicher einspart und so die Web-Anwendungen optimieren kann. Offenbar scheint das genau falsch zu sein…
PHP’s Referenzen werden nämlich nicht so behandelt wie zum Beispiel die Pointer aus anderen Programmiersprachen. Besonders wer objektorientiert programmiert kann unter Umständen auf diese Tücke reinfallen.
Variablen müssen in PHP auch garnicht als neue Refernz deklariert werden, solange kein Schreibzugriff erfolgt. Dafür sorgt der copy-on-write Mechanismus von PHP 5. Dieser sorgt dafür, dass beim Kopieren einer Variable mittels:
$a = (int) 5; $b = $a;
Zunächst $b auf denselben Wertebereich im Speicher zeigt, wie $a. Erst, wenn eine Schreibfunktion auf $b oder $a angewandt wird (zum Beispiel $b++ oder $a=”foo”), wird eine Kopie der Variable erzeugt. Das funktioniert deshalb, weil PHP wie bei Objekten einen Container im Speicher definiert und die Variablennamen auf die Werte in diesen Containern zeigen.
Johannes Schlüter zeit in seinem Blog auf, dass es in den allermeisten Fällen eher schlecht für die Performance von Web-Anwendungen unter PHP ist, Variablen zu referenzieren: do not use PHP Refernces .
Nach einem schnellen Selbsttest mit einem kleinen PHP-Skript kann ich sagen: Es scheint zu stimmen. PHP’s Referenzen auf Variablen verlangsamen den Code an einigen Stellen schon merklich. Ich werde mal einen Benchmark meiner größeren Anwendungen machen und gucken, wieviel Optimierungspotential es dort noch gibt.