PHP-Performance bei Inkrementierungen

PHP-Performance bei Inkrementierungen

Marc Ruef
von Marc Ruef
Lesezeit: 6 Minuten

Performance spielt auch in Bezug auf die Sicherheit eine zentrale Rolle. Bleibt die zeitnahe Abarbeitung von Prozessen nämlich aus, kann dies zu einer Denial of Service für den Dienst führen. Entsprechend ist es bei zeitkritischen Applikationen besonders wichtig, dass die jeweiligen Entwickler ebenfalls ihr Augenmerk auf die Performance ihrer Lösung legen.

Damit wir derartige Schwächen in Applikationen ausmachen können, suchen wir fortwährend nach effizienten Programmierstilen. Beispielsweise wird besonders im PHP-Umfeld seit langer Zeit über die Performance unterschiedlicher Inkrementierungs-Mechanismen diskutiert.

Für einen Performancetest der unterschiedlichen Implementierungen wurde ein Apache Webserver mit PHP verwendet. Das jeweilige Skript durchläuft 100’000 mal eine for-Schleife mit unterschiedlichen Inkrementierungsmethoden:

Dabei stellt sich heraus, dass eine Pre-Inkrementierung der Form ++$i am effizientesten ist und gegenüber einer klassischen Addition der Form $i = $i + 1 einen Geschwindigkeitsvorteil von etwa 22.46 % bringt.

Art Beispiel Laufzeit Gewinn
Addition $i = $i + 1 0.038587 ms
Post-Inkrement $i++ 0.029917 ms ≅22.46%
Pre-Inkrement ++$i 0.026696 ms ≅30.81%

Der Grund dafür liegt darin, dass eine Berechnung ganze 5 Schritte erfordert. Bei einem Post-Inkrement kann auf das Laden der 1 in die ALU verzichtet werden, wodurch nur 4 Schritte erforderlich sind. Und bei einem Pre-Inkrement kann zusätzlich das Laden von $i in den Register gespart werden, wodurch gar nur 3 Schritte erforderlich bleiben.

Arbeitsschritt $i+1 $i++ ++$i
Lade i in Register 1 1
Lade i in ALU 2 2 1
Lade 1 in ALU 3
Inkrementiere ALU 3 2
Addiere ALU 4
Speichere Ergebnis aus ALU in Register 5 4 3

In dieser Hinsicht gibt es eine Vielzahl unterschiedlicher Paradigmen und Implementierugen, die sich auf die Performance einer Applikation auswirken können. Dabei gibt es einerseits sprachübergreifende Eigenarten:

Ebenso gibt es sprachspezifische und compilerabhängige Eigenarten. Visual Basic 6 bietet hier einige sonderbare Eigenarten, die vielen Entwicklern nicht bekannt sind oder unterschätzt werden:

Update 09. November 2009: Diese Präsentation zeigt sehr eindrücklich mögliche Optimierungen, wie sie bei Javascript zum Tragen kommen können.

Über den Autor

Marc Ruef

Marc Ruef ist seit Ende der 1990er Jahre im Cybersecurity-Bereich aktiv. Er hat vor allem im deutschsprachigen Raum aufgrund der Vielzahl durch ihn veröffentlichten Fachpublikationen und Bücher – dazu gehört besonders Die Kunst des Penetration Testing – Bekanntheit erlangt. Er ist Dozent an verschiedenen Fakultäten, darunter ETH, HWZ, HSLU und IKF. (ORCID 0000-0002-1328-6357)

Links

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

×
Konkrete Kritik an CVSS4

Konkrete Kritik an CVSS4

Marc Ruef

scip Cybersecurity Forecast

scip Cybersecurity Forecast

Marc Ruef

Voice Authentisierung

Voice Authentisierung

Marc Ruef

Bug-Bounty

Bug-Bounty

Marc Ruef

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv