Nicht benötigte Variablen mit unset löschen

Eine häufig gestellte Frage ist, ob das Löschen im Script nicht mehr benötigter Variablen Speicher freisetzt bzw. so viel Speicher freisetzt, dass sich dadurch die Performance eines PHP-Scripts verbessern lässt. Wir haben drei kleine PHP-Scripte programmiert, um die Auswirkungen von unset() auf die Performance zu testen.

ohne unset()

Code:

<?php
for ($i = 0;$i < 10000;$i++) {
    $test[$i] = "Beispiel";
}
for ($i = 10000;$i < 20000;$i++) {
    $test[$i] = "Beispiel";
}
?>

Erläuterung:
In zwei for()-Schleifen werden einem Array jeweils 10.000 Werte hinzugefügt.

mit unset()

Code:

<?php
for ($i = 0;$i < 10000;$i++) {
    $test[$i] = "Beispiel";
}
unset($test);
for ($i = 10000;$i < 20000;$i++) {
    $test[$i] = "Beispiel";
}
?>

Erläuterung:
Nach Hinzufügen von 10.000 Werten zu einem Array innerhalb einer Schleife wird das Array mit unset() gelöscht. Anschließend wird die gleiche Schleife nochmals durchlaufen, als Array-Keys jedoch nicht mehr die Zahlen von 0-9.999, sondern von 10.000 bis 19.000 verwendet wie im ersten Beispiel-Script.

20.000mal unset()

Code:

<?php
for ($i = 0;$i < 10000;$i++) {
    $test[$i] = "Beispiel";
    unset($test);
}
for ($i = 10000;$i < 20000;$i++) {
    $test[$i] = "Beispiel";
    unset($test);
}
?>

Erläuterung:
Nach jedem Hinzufügen des Wertes Beispiel wird das Array gelöscht, also insgesamt 20.000mal.

Ergebnis

Requests per second (RPS)Time per Request (TPR)Vergleich
ohne unset()36.55 [#/sec] (mean)27.359 [ms] (mean)
28.8%
22.4%
mit unset()40.30 [#/sec] (mean)24.813 [ms] (mean)
42.0%
29.6%
20.000mal unset()28.38 [#/sec] (mean)35.234 [ms] (mean)

Das 20.000mal die unset()-Funktion aufrufende Script ist mit Abstand am langsamsten. Script 2 mit einmaliger Verwendung der unset()-Funktion ist rund 10% schneller als das erste Script ohne Verwendung der unset()-Funktion.

Fazit

Da jeder Funktionsaufruf Zeit kostet, wäre es sehr schädlich für die Performance, jede nicht mehr benötigte Variable mittels der unset()-Funktion zu löschen. Um die 10% geringere Ausführzeit des Scripts mit der unset()-Funktion gegenüber dem ersten Beispiel-Script ohne unset()-Funktion näher untersuchen zu können, modifizieren wir die ersten beiden Scripte und unterziehen sie einem erneuten Benchmark:

ohne unset()

Code:

<?php
for ($i = 0;$i < 10000;$i++) {
    $testa['a_' . $i] = "Ein etwas längerer Beispielwert für unser Test-Array";
}
for ($i = 10000;$i < 20000;$i++) {
    $testb['b_' . $i] = "Ein etwas längerer Beispielwert für unser Test-Array";
}
?>

Erläuterung:
In den beiden Schleifen werden nun zwei unterschiedlichen Arrays je 10.000 Werte hinzugefügt. Um einen möglichen Performance-Unterschied deutlicher erkennen zu können, werden als Array-Keys nicht mehr nur Zahlen verwendet und der hinzugefügte String-Wert hat nun mehr Zeichen.

mit unset()

Code:

<?php
for ($i = 0;$i < 10000;$i++) {
    $testa['a_' . $i] = "Ein etwas längerer Beispielwert für unser Test-Array";
}
unset($testa);
for ($i = 10000;$i < 20000;$i++) {
    $testb['b_' . $i] = "Ein etwas längerer Beispielwert für unser Test-Array";
}
?>

Erläuterung:
Die gleichen Änderungen haben wir am ursprünglich zweiten Beispiel-Script mit Verwendung der unset()-Funktion vorgenommen. Nach Durchlauf der ersten Schleife wird das Array $testa mit unset() gelöscht.

Ergebnis

Requests per second (RPS)Time per Request (TPR)Vergleich
ohne unset()19.37 [#/sec] (mean)51.639 [ms] (mean)
mit unset()21.69 [#/sec] (mean)46.098 [ms] (mean)
12.0%
10.7%

Das Script mit Verwendung von unset() benötigte rund 10% weniger Ausführzeit als das Script ohne unset().

Fazit

Der zweite Benchmark-Test bestätigt die Ergebnisse des mit den ersten drei Scripten durchgeführten Benchmark. Durch den sinnvollen (!) Einsatz von unset() lässt sich die Ausführzeit Ihrer Scripte verringern und die Performance verbessern.

 

Anmerkung:
Die Tests wurden mit dem Apache HTTP server benchmarking tool ab auf einem im Februar 2017 nicht mehr dem Stand der Technik entsprechenden Server durchgeführt. Die RPS und TPR der getesteten PHP-Scripte sollten auf einem im Produktiv-Einsatz befindlichen Webserver deutlich besser sein.

Nächster Tipp: