Geschrieben von: Christoph Wille
Kategorie: Optimierung
This printed page brought to you by AlphaSierraPapa
Ein von Anfängern oft übersehener Bereich der Programmierung ist die Optimierung des geschriebenen Codes. Aber auch Experten sollten sich dieses Themas annehmen - denn nur eine Geschwindigkeitsmessung kann genauen Aufschluß über die Performance verschiedener Lösungsansätze bringen. Gefühlsmäßige Entscheidungen sind meist falsch.
Nehmen wir als Beispiel die Diskussion um das Formatieren der Zahl 0 aus der AspGerman Newsliste. Folgender Code wurde vorgeschlagen:
Replace(FormatNumber(Variable, 2, -1),"0,00","0")Abgesehen davon, daß neben der gewünschten Umwandlung von 0,00 in 0 auch alle zehnfachen (70,00 etc) gekürzt werden (in 70), hat dieser Lösungsansatz gegenüber
Function Waehrung(Variable) If Variable <> 0 then Waehrung = FormatNumber(Variable, 2, -1) Else Waehrung = "0" End If End Functionsogar einen krassen Geschwindigkeitsnachteil - und zwar von über 330 Prozent! Und das bei einer Implementierung als Funktion! Inline wäre er sogar noch um vieles größer (500 Prozent).
Und wie komme ich zu diesen Zahlen? Ganz einfach: da wir hausintern große Seiten zu optimieren haben, habe ich eine Komponente zur Geschwindigkeitsmessung programmiert (gratis erhältlich bei IISDEV auf unserem Server). Ich habe die oben vorgestellten Lösungsansätze mit der Profiler Komponente gemessen, und zwar mit folgender ASP Datei:
<% Function Waehrung(Variable) If Variable <> 0 then Waehrung = FormatNumber(Variable, 2, -1) Else Waehrung = "0" End If End Function Dim xObj, i, Variable, interim, runCount Dim timerStart, timerDiff, profileElapsed, prfTime1, prfTime2 Set xObj = Server.CreateObject("Softwing.Profiler") runCount = 100 Variable = 0 xObj.ProfileStart() For i = 1 To runCount interim = Replace(FormatNumber(Variable, 2, -1),"0,00","0") Next profileElapsed = xObj.ProfileStop() prfTime1 = profileElapsed / runCount Variable = 0 xObj.ProfileStart() For i = 1 To runCount interim = Waehrung(Variable) Next profileElapsed = xObj.ProfileStop() prfTime2 = profileElapsed / runCount Response.Write (prfTime1/prfTime2*100) %>
Erwähneswert ist die Variable runCount: da ein einziger Durchlauf keine Aussagekraft hat, muß man den Code in einer Schleife laufen lassen und den Mittelwert bilden. Der Einfachheit halber habe ich 100 Durchläufe eingestellt - und dennoch wird bei jedem Aufruf dieser Seite sich der Prozentsatz ändern (der Grund ist zb die Zuweisung der Prozessorzeit an den IIS, etc). Die Zahlen, die ich ermittelt habe, stammen von einem PIII 450, IIS 5.0 RC1.
Was lernen wir aus diesem Beispiel? Vermeintlich elegante oder kurze Lösungen sind nicht immer die schnellsten. Und Entscheidungen über Geschwindigkeitsvorteile sollten nie aus dem Bauch heraus getroffen werden.
This printed page brought to you by AlphaSierraPapa
Highspeed-Abfragen einer SQL Server Datenbank
http:/www.aspheute.com/artikel/20001013.htm
Webserver-Tuning mit XTune
http:/www.aspheute.com/artikel/20000814.htm
IISDEV Profiling Komponente
http://www.alphasierrapapa.com/IisDev/Components/Profiler/
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.