30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

5. Funktionen 101<br />

feilscht (=l<strong>in</strong>eare Ersparnis), obwohl e<strong>in</strong> Algorithmus mit Komplexität<br />

O(n 2 ) (=quadratischer Verlust) oder schlimmer im E<strong>in</strong>satz ist.<br />

Um das Gesagte zu untermauern, möchte ich hier e<strong>in</strong>e kle<strong>in</strong>e Geschichte<br />

erzählen, die sich im Jahr 1990 ereignet hat: Es wurde e<strong>in</strong> Paket zur Berechnung<br />

e<strong>in</strong>er speziellen Regression auf e<strong>in</strong>er für damals sehr leistungsfähigen<br />

Unix-Workstation entwickelt. Leider war e<strong>in</strong> sehr naiver Entwickler<br />

am Werk, der ke<strong>in</strong>e Rücksicht auf die Beschaffenheit der Daten nahm<br />

und wahnwitzigste Matrix-Operationen, mit e<strong>in</strong>er Laufzeitkomplexität von<br />

O(n 2 ) bis O(n 3 ), je nach Art der Berechnung, implementierte.<br />

Ergebnis: E<strong>in</strong> Programmlauf dauerte im Durchschnitt zwei Tage. Der<br />

verzweifelte Entwickler <strong>in</strong>vestierte viel Zeit <strong>in</strong> sehr naive Laufzeitoptimierung<br />

(hier e<strong>in</strong> paar Statements, dort e<strong>in</strong> paar...), aber der Erfolg war nur<br />

m<strong>in</strong>imal. Der beste Wert wurde mit 1 1/2 Tagen Laufzeit erreicht.<br />

Nachdem der mittlerweile völlig entnervte Entwickler aufgab, wurde das<br />

Programm auf se<strong>in</strong>e Komplexität untersucht und e<strong>in</strong>em entsprechenden<br />

kompletten Redesign unterzogen. Besonderes Augenmerk wurde hierbei<br />

auf <strong>in</strong>terne Datenstrukturen gelegt. Der Zeitaufwand vom Beg<strong>in</strong>n des<br />

Redesigns bis zur fertigen Implementation betrug weniger als die Hälfte<br />

der zuvor zur s<strong>in</strong>nlosen Optimierung <strong>in</strong>vestierten Zeit. Der Erfolg war<br />

aber durchschlagend: Die Komplexität aller Berechnungen lag nunmehr<br />

bei O(n). Damit wurde die Laufzeit des Programms, mit denselben Daten<br />

wie zuvor, auf weniger als e<strong>in</strong>e M<strong>in</strong>ute reduziert!<br />

Als kle<strong>in</strong>es Detail am Rande wäre hier noch zu erwähnen, dass das s<strong>in</strong>nvoll<br />

optimierte Programm sauber und gut lesbar war. Ganz im Gegensatz zu<br />

dem Meisterwerk, das durch den verzweifelten ersten Optimierungsversuch<br />

entstand, denn dieses war durch das Herausquetschen der letzten kle<strong>in</strong>en<br />

Instruktionen e<strong>in</strong>fach gar nicht mehr lesbar.<br />

• Damit Komplexitätsverbesserungen garantiert den gewünschten Effekt<br />

br<strong>in</strong>gen, sollte man auf jeden Fall auch auf die worst-Case Komplexität<br />

e<strong>in</strong>es Algorithmus losgehen, nicht nur auf den Durchschnitt (außer, man<br />

kann den worst-Case garantiert ausschalten). Das bekannteste Beispiel<br />

e<strong>in</strong>es Algorithmus mit O(log(n)) average-Komplexität, die allerd<strong>in</strong>gs zu<br />

O(n 2 ) im worst-Case entarten kann, ist Quicksort. Wenn man diesem die<br />

“falschen” Daten füttert ist es ganz und gar nicht mehr so quick :-).<br />

• Performancetests sollten immer auch auf viel zu ger<strong>in</strong>g ausgestatteten Systemen<br />

mit gleichzeitig viel zu großer Belastung stattf<strong>in</strong>den. Auf diese Art<br />

lassen sich leichter unangenehme Effekte f<strong>in</strong>den (auch sehr geeignet für den<br />

Test auf subjektive Performance!).<br />

• Während der Phase der Optimierungen muss man immer darauf achten,<br />

nur e<strong>in</strong>e Sache auf e<strong>in</strong>mal zu optimieren und dann e<strong>in</strong>en Vergleichstest<br />

durchzuführen. Der Grund dafür ist e<strong>in</strong>fach zu erkennen: Wenn man <strong>in</strong><br />

e<strong>in</strong>em Programm an mehreren Baustellen gleichzeitig arbeitet, lässt sich<br />

nicht mehr sagen, von welcher der Maßnahmen nun welcher Effekt ausgeht.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!