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 Function
sogar 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.