Optimierung mit isset, empty und Vergleichsoperatoren bei Strings

PHP bietet unterschiedliche Operatoren, um Variablen auf Existenz bzw. vorhandenen Inhalt zu prüfen. Bei den Beispiel-Scripten auf dieser Seite wird davon ausgegangen, dass die Variablen einen String enthalten, leer sind oder nicht existent. Die äquivalenten Benchmark-Ergebnisse von Scripts, bei denen die Variablen Zahlenwerte enthalten, finden Sie unter empty und Vergleichsoperatoren bei Zahlen.

Nicht existente Variable mit isset()

Code:

<?php
for ($i = 0;$i < 10000;$i++) {
    if (isset($test)) {
        echo "test";
    } else {
        echo "test";
    }
}
?>

Erläuterung:
Innerhalb einer for()-Schleife wird 10.000mal mit isset() geprüft, ob die Variable $test existiert. Wenn die Variable vorhanden ist, wird mittels des echo-Konstrukts ebenso der String test ausgegeben, wie es innerhalb der else-Anweisung erfolgt, wenn die Variable nicht existent ist. In unserem Beispiel trifft letzteres zu.

Nicht existente Variable mit !empty()

Code:

<?php
for ($i = 0;$i < 10000;$i++) {
    if (!empty($test)) {
        echo "test";
    } else {
        echo "test";
    }
}
?>

Erläuterung:
Dieser Code entspricht weitestgehend dem vorangegangenen Beispiel-Script. Die Überprüfung der Variable erfolgt nun mittels !empty(). Da die Variable nach wie vor nicht existiert, sind die Auswirkungen der Überprüfung und des gesamten Codes identisch mit dem vorangegangenen. Der Unterschied: Wäre die Variable $test vorhanden und würde den Wert 0 oder einen leeren String („“) enthalten, würde im ersten Beispiel-Script die Überprüfung isset() positiv ausfallen und das erste echo-Konstrukt aufgerufen werden, während in diesem Code !empty() weiterhin false liefern würde und das echo-Konstrukt innerhalb der else-Anweisung aufgerufen wird.

Leere Variable mit isset() && !==““

Code:

<?php
$test = "";
for ($i = 0;$i < 10000;$i++) {
    if (isset($test) && $test !== "") {
        echo "test";
    } else {
        echo "test";
    }
}
?>

Erläuterung:
In diesem Beispiel-Code ist die Variable $test existent und enthält einen leeren String. Die Überprüfung mit isset() liefert also true zurück, die Überprüfung $test!=="" fällt jedoch negativ aus. Folglich wird das echo-Konstrukt in der else-Anweisung aufgerufen.

Leere Variable mit isset() && !=““

Code:

<?php
$test = "";
for ($i = 0;$i < 10000;$i++) {
    if (isset($test) && $test != "") {
        echo "test";
    } else {
        echo "test";
    }
}
?>

Erläuterung:
Das Beispiel entspricht dem vorangegangenen. Der einzige Unterschied ist, dass die zweite Überprüfung der $test-Variablen mit != statt mit !== erfolgt.

Leere Variable mit !empty

Code:

<?php
$test = "";
for ($i = 0;$i < 10000;$i++) {
    if (!empty($test)) {
        echo "test";
    } else {
        echo "test";
    }
}
?>

Erläuterung:
Die vorhandene, aber nur einen leeren String enthaltende Variable $test wird via !empty geprüft. Diese Überprüfung fällt negativ aus und es wird test innerhalb der else-Anweisung ausgegeben.

Einstellige Variable mit isset() && !==““

Code:

<?php
$test = "a";
for ($i = 0;$i < 10000;$i++) {
    if (isset($test) && $test !== "") {
        echo "test";
    } else {
        echo "test";
    }
}
?>

Erläuterung:
Der Variablen $test wird nun der Wert a zugewiesen. Die beiden Überprüfungen mit isset() und !=="" liefern jeweils true zurück und der String test wird ausgegeben. Der Inhalt der else-Anweisung kommt nicht zum Tragen.

Einstellige Variable mit isset() && !=““

Code:

<?php
$test = "a";
for ($i = 0;$i < 10000;$i++) {
    if (isset($test) && $test != "") {
        echo "test";
    } else {
        echo "test";
    }
}
?>

Erläuterung:
Im Unterschied zum vorangegangenen Beispiel erfolgt die zweite Überprüfung der $test-Variablen mit != statt mit !==. Der Rückgabewert der Überprüfung ist in diesem Fall identisch mit dem im vorangegangenen Beispiel.

Einstellige Variable mit !empty

Code:

<?php
$test = "a";
for ($i = 0;$i < 10000;$i++) {
    if (!empty($test)) {
        echo "test";
    } else {
        echo "test";
    }
}
?>

Erläuterung:
In unserem letzten Beispiel-Script wird die vorhandene und a enthaltende Variable $test mit !empty() positiv geprüft.

Ergebnis

Requests per second (RPS)Time per Request (TPR)Vergleich
Nicht existente Variable mit isset()130.61 [#/sec] (mean)7.656 [ms] (mean)
33.3%
25.0%
Nicht existente Variable mit !empty()122.14 [#/sec] (mean)8.188 [ms] (mean)
24.6%
19.7%
Leere Variable mit isset() && !==““109.22 [#/sec] (mean)9.156 [ms] (mean)
11.4%
10.3%
Leere Variable mit isset() && !=““98.01 [#/sec] (mean)10.203 [ms] (mean)
Leere Variable mit !empty118.52 [#/sec] (mean)8.438 [ms] (mean)
20.9%
17.3%
Einstellige Variable mit isset() && !==““112.08 [#/sec] (mean)8.922 [ms] (mean)
14.4%
12.6%
Einstellige Variable mit isset() && !=““100.79 [#/sec] (mean)9.922 [ms] (mean)
2.8%
2.8%
Einstellige Variable mit !empty117.22 [#/sec] (mean)8.531 [ms] (mean)
19.6%
16.4%

 

Fazit

Bei Variablen, deren Existenz ungewiss ist, liefert die Überprüfung mit isset() das beste Ergebnis bzw. benötigt am wenigsten Ausführzeit. Ist es wahrscheinlich, dass die Variable vorhanden ist und zu prüfen, ob sie einen Inhalt ungleich einem leeren String oder 0 enthält, liefert das empty-Konstrukt die bessere Performance gegenüber der „doppelten” Überprüfung mit isset() und !="" bzw. !=="" oder !==0.

 

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: Schleifen

Anhand der Ergebnisse unserer Performance-Tests lässt sich sicherlich diskutieren, ob ein minimaler Performance-Gewinn zu Lasten der Lesbarkeit des Codes vorzuziehen ist. Kommen wir zum nächsten Thema: Schleifen.

for, while und foreach - Performance verbessern mit der richtigen Schleife

for, while und foreach - Performance verbessern mit der richtigen Schleife

Beim Durchlaufen von Arrays bietet PHP unterschiedliche Möglichkeiten. Die richtige Wahl hängt unter anderem davon ab, ob nur auf den Array-Wert oder auch auf den Key zugegriffen werden muss. Während foreach() eine Kopie des Arrays anfertigt, muss bei while()-Schleifen der „Zeiger” mit reset() zurückgesetzt werden. Die for()-Schleife zum Durchlaufen von Arrays ist nur dann sinnvoll …