Konkrete Kritik an CVSS4
Marc Ruef
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:
$i = $i + 1
): Schulvariante mit Addition von 1.$i++
): Klassische Variante mit Hochzählen.++$i
): Alternative klassische Variante.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:
str_replace
) sollte nur dann vorgenommen werden, wenn zuvor mit einer kostengünstigen Funktion die Notwendigkeit verifiziert werden konnte (z.B. strpos
).count(array)
). Stattdessen sollte das Resultat vorbereitet werden ($arraycount = count($array))
).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:
LenB(sInput)
schneller als mit Len(sInput)
oder einem sInput = ""
sString = vbNullString
als mit sString = ""
Mid$()
und UCase$()
sind schneller als ihre allgemeinen Pendants Mid()
und UCase()
.AscW()
und ChrW$()
ist schneller weder mit Asc()
und Chr()
, da die interne Stringverarbeitung von VB6 auf Unicode basiert.vbNullChar
und vbTab
ist schneller weder die Zeichenerstellung ChrW$(0)
oder ChrW$(9)
.vbBinaryCompare
sind immer schneller weder stringprüfungen mit vbTextCompare
.Update 09. November 2009: Diese Präsentation zeigt sehr eindrücklich mögliche Optimierungen, wie sie bei Javascript zum Tragen kommen können.
Unsere Spezialisten kontaktieren Sie gern!
Marc Ruef
Marc Ruef
Marc Ruef
Marc Ruef
Unsere Spezialisten kontaktieren Sie gern!