Optimierung mit empty und Vergleichsoperatoren bei Zahlen

Um den einer Variablen zugeordneten Zahlenwert zu ermitteln und Bedingungen für die weitere Verarbeitung anzugeben, stehen in PHP unterschiedliche Operatoren zur Verfügung. Wir haben einige Scripts mit den beliebtesten Varianten erstellt und diese einem Benchmark-Test unterzogen, um festzustellen, ob sich durch Wahl unterschiedlicher Varianten Auswirkungen auf die Performance ergeben.

Zahl 0 !empty()

Code:

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

Erläuterung:
Der Variablen $test wird der integere Wert 0 zugewiesen. Innerhalb einer for()-Schleife wird 10.000mal mit dem empty()-Konstrukt überprüft, ob $test „leer” ist. Da die Variable den Wert 0 enthält, gibt empty() TRUE zurück. Unabhängig vom Rückgabewert von empty() wird anschließend via echo der String test ausgegeben.

Zahl 0!=0

Code:

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

Erläuterung:
Im Gegensatz zum ersten Beispiel-Script wird der Inhalt der $test-Variable nun mit !=0 geprüft. Da wir wissen, dass es sich bei dem Wert um eine integere Zahl handelt, ist das Ergebnis das gleiche wie beim ersten Beispiel-Script.

Zahl 0!==0

Code:

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

Erläuterung:
Der Code unterscheidet sich praktisch nicht vom vorangegangenen. Auch hier wissen wir, dass es sich beim Wert der Variablen $test um eine integere Zahl handelt. Der Vergleichsoperator !== führt somit zum gleichen Ergebnis wie != im vorangegangenen Beispiel.

Zahl 0>0

Code:

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

Erläuterung:
In diesem Beispiel-Code stellen wir den Vergleich mit dem Operator > an. Dies bewirkt das gleiche wie in den vorangegangenen Beispielen.

Zahl 1 !empty()

Code:

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

Erläuterung:
Der $test-Variablen wird nun der Wert 1 zugewiesen. Sie ist also nicht mehr „leer” und die Überprüfung mit dem empty()-Konstrukt gibt FALSE zurück.

Zahl 1!=0

Code:

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

Erläuterung:
Die Variable $test enthält wie im vorangeganenen Beispiel den Wert 1. An Stelle des empty()-Konstrukts prüfen wir den Inhalt der Variablen mit !=.

Zahl 1!==0

Code:

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

Erläuterung:
Im Gegensatz zum vorangegagenen Beispiel nehmen wir den Vergleich in diesem Code mit !== vor. Dies führt zum gleichen Ergebnis, da der Wert von $test eine integere Zahl ist.

Zahl 1>0

Code:

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

Erläuterung:
In unserem letzten Beispiel-Code wird der Vergleich mit > durchgeführt.

Ergebnis

Requests per second (RPS)Time per Request (TPR)Vergleich
Zahl 0 !empty()126.73 [#/sec] (mean)7.891 [ms] (mean)
Zahl 0!=0134.45 [#/sec] (mean)7.438 [ms] (mean)
6.1%
5.7%
Zahl 0!==0137.34 [#/sec] (mean)7.281 [ms] (mean)
8.4%
7.7%
Zahl 0>0139.74 [#/sec] (mean)7.156 [ms] (mean)
10.3%
9.3%
Zahl 1 !empty()131.42 [#/sec] (mean)7.609 [ms] (mean)
3.7%
3.6%
Zahl 1!=0129.29 [#/sec] (mean)7.734 [ms] (mean)
2.0%
2.0%
Zahl 1!==0141.59 [#/sec] (mean)7.063 [ms] (mean)
11.7%
10.5%
Zahl 1>0135.02 [#/sec] (mean)7.406 [ms] (mean)
6.5%
6.1%

Die Codes mit dem empty()-Konstrukt benötigen rund 5-10% mehr Zeit als die Scripte mit Vergleichsoperatoren. Die Scripte, bei denen Vergleichsoperatoren eingesetzt werden, unterscheiden sich in der Ausführzeit nur unwesentlich.

Fazit

Wenn es darum geht, ob eine Variable den Wert 0 oder einen größeren Integerwert hat, ist ein Vergleichsoperator dem empty()-Konstrukt vorzuziehen. Die Unterschiede sind jedoch nur unwesentlich.

 

Anmerkung:
Die Tests wurden mit dem Apache HTTP server benchmarking tool ab auf einem heute 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

empty und die Vergleichsoperatoren bei Zahlen bieten also nur geringfügiges Potenzial, die Performance zu verbessern. Doch wie sieht es bei ähnlichen Vorgängen in Bezug auf Strings aus?

Optimierung mit isset, empty und Vergleichsoperatoren bei Strings

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.