Inhaltsverzeichnis
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 Zeichen | 39.26 [#/sec] (mean) | 25.469 [ms] (mean) | 64.8% | 39.3% |
String 1 Zeichen | 141.91 [#/sec] (mean) | 7.047 [ms] (mean) | 495.5% | 83.2% |
Konstantenmissbrauch 20 Zeichen | 23.83 [#/sec] (mean) | 41.969 [ms] (mean) | ||
String 20 Zeichen | 124.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.