Performance verbessern durch Vermeidung von Konstantenmissbrauch

Der Missbrauch von Konstanten bei Array-Keys ist vor allem bei Anfängern ein beliebter Fehler. Da abhängig von error_reporting()-Level bzw. der display_errors()-Einstellung auf den meisten Servern von Webhosting-Anbietern beim Ausführen des PHP-Codes keine Fehlermeldung ausgegeben wird, fällt der Fehler oftmals gar nicht auf. Zur Verbesserung der Performance sollte er jedoch in jedem Fall vermieden werden nach dem Schema richtig $array['key'] statt $array[key]

Unsere Benchmarks sollen verdeutlichen, wieviel Zeitersparnis die richtige Verwendung von Array-Keys bedeuten kann.

Konstantenmissbrauch 1 Zeichen

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

Erläuterung:
Einem Array mit der einstelligen Konstanten a als Key wird 10.000mal der Wert Beispiel zugeordnet.

String 1 Zeichen

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

Erläuterung:
Unserem Array mit dem richtig angegebenen Key a wird innerhalb einer 10.000mal durchlaufenen Schleife der Wert Beispiel zugeordnet.

Konstantenmissbrauch 20 Zeichen

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

Erläuterung:
Um zu verdeutlichen, dass je mehr Zeichen die missbrauchte Konstante hat, desto mehr Zeit der Fehler kostet, verwenden wir nun als Array-Key eine Konstante mit 20 Zeichen.

String 20 Zeichen

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

Erläuterung:
Auch die richtige Angabe eines Strings mit 20 Zeichen als Array-Key wird mehr Zeit beanspruchen als mit dem einstelligen Key. Proportional wird die Ausführzeit jedoch geringer zunehmen als beim Missbrauch einer 20stelligen Konstante gegenüber einer 1stelligen Konstante.

Ergebnis

Requests per second (RPS)Time per Request (TPR)Vergleich
Konstantenmissbrauch 1 Zeichen39.26 [#/sec] (mean)25.469 [ms] (mean)
64.8%
39.3%
String 1 Zeichen141.91 [#/sec] (mean)7.047 [ms] (mean)
495.5%
83.2%
Konstantenmissbrauch 20 Zeichen23.83 [#/sec] (mean)41.969 [ms] (mean)
String 20 Zeichen124.27 [#/sec] (mean)8.047 [ms] (mean)
421.5%
80.8%

Die Vermeidung des Konstantenmissbrauchs bei einem einstelligen String bewirkt eine 3,6mal schnellere Ausführzeit. Bei einem 20stelligen String bringt die richtige Schreibweise sogar eine Zeitersparnis von über 80%, der Code wird 5,2mal schneller ausgeführt.

Fazit

Davon abgesehen, dass Konstantenmissbrauch in jedem Fall zu vermeiden ist, nimmt die Ausführzeit mit zunehmender Länge der Konstante proportional deutlich mehr zu als dies bei zunehmender Länge von Strings als Array-Keys der Fall ist.

Wenn Sie sich für weitere Benchmarks in Bezug auf Array-Keys interessieren, beachten Sie bitte auch unsere Test-Ergebnisse unter Array-Keys als String oder Ganzzahl.

 

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.

Lesen Sie weiter…