Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Geschwindigkeitsmessungen in ASP

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

Verwandte Artikel

Highspeed-Abfragen einer SQL Server Datenbank
http:/www.aspheute.com/artikel/20001013.htm
Webserver-Tuning mit XTune
http:/www.aspheute.com/artikel/20000814.htm

Links zu anderen Sites

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.