PHP-Performance bei Inkrementierungen

PHP-Performance bei Inkrementierungen

Marc Ruef
by Marc Ruef
time to read: 6 minutes

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.

About the Author

Marc Ruef

Marc Ruef has been working in information security since the late 1990s. He is well-known for his many publications and books. The last one called The Art of Penetration Testing is discussing security testing in detail. He is a lecturer at several universities, like ETH, HWZ, HSLU and IKF. (ORCID 0000-0002-1328-6357)

Links

You need support in such a project?

Our experts will get in contact with you!

×
Data Markets

Data Markets

Marc Ruef

Password Leak Analysis

Password Leak Analysis

Marc Ruef

MITRE ATT&CK

MITRE ATT&CK

Marc Ruef

You want more?

Further articles available here

You need support in such a project?

Our experts will get in contact with you!

You want more?

Further articles available here