ASP Tipp 20: Vermeiden Sie die Zeichenfolgenverkettung in Schleifen

Viele Benutzer erstellen eine Zeichenfolge in einer Schleife wie folgt:

s = „<table>“ & vbCrLf

For Each fld in rs.Fields

s = s & „<th>“ & fld.Name & „</th>“

Next

While Not rs.EOF

s = s & vbCrLf & „<tr>“

For Each fld in rs.Fields

s = s & „<td>“ & fld.Value & „</td>“

Next

s = s & „</tr>“

rs.MoveNext

Wend

s = s & vbCrLf & „</table>“ & vbCrLf

Response.Write s

Bei dieser Methode gibt es mehrere Probleme. Als Erstes wird beim wiederholten Verketten von Zeichenfolgen quadratische Zeit gebraucht, d. h. die Zeit zum Ausführen dieser Schleife ist proportional zum Quadrat der Anzahl der Datensätze mal der Anzahl der Felder. Ein einfacheres Beispiel müsste dies deutlich machen.

s = „“

For i = Asc(„A“) to Asc(„Z“)

s = s & Chr(i)

Next

Bei der ersten Wiederholung erhalten Sie eine aus einem Zeichen bestehende Zeichenfolge, „A“. Bei der zweiten Wiederholung muss VBScript die Zeichenfolge neu zuweisen und zwei Zeichen („AB“) nach s kopieren. Bei der dritten Wiederholung muss s erneut zugewiesen und drei Zeichen nach s kopiert werden. Bei der Nten (26.) Wiederholung müssen N Zeichen neu zugewiesen und nach s kopiert werden. Dies ergibt eine Summe von 1+2+3+…+N und entspricht N*(N+1)/2 Kopiervorgängen.

Im oben dargestellten Beispiel für ein Recordset würde die innere Schleife bei 100 Datensätzen und 5 Feldern 100*5 = 500 mal ausgeführt werden, und die für alle Kopiervorgänge und Neuzuweisungen benötigte Zeit wäre proportional zu 500*500 = 250,000. Das sind für ein Recordset von mäßiger Größe recht viele Kopiervorgänge.

In diesem Beispiel könnte der Code verbessert werden, wenn die Zeichenfolgenverkettung durch Response.Write() oder Inlineskript (<% = fld.Value %>) ersetzt würde. Wenn der Antwortpuffer (wie empfohlen) aktiviert wird, ist dieser Code schnell, da Response.Write die Daten einfach am Ende des Antwortpuffers anhängt. Hierbei ist keine Neuzuweisung notwendig, und der Code ist sehr effizient.

In dem Sonderfall beim Transformieren eines ADO-Recordsets in eine HTML-Tabelle sollten Sie die Verwendung von GetRows oder GetString in Betracht ziehen.

Wenn Sie Zeichenfolgen in JScript verketten, wird dringend empfohlen, dass Sie den +=-Operator verwenden, d. h. verwenden Sie s += „some string“, und nicht s = s + „some string“.

ASP Tipp 21: Aktivieren Sie Browser- und Proxyzwischenspeicherung

ASP deaktiviert das Zwischenspeichern in Browsern und Proxys automatisch. Dies ist sinnvoll, da eine ASP-Seite von Natur aus dynamisch ist und potenziell zeitempfindliche Informationen enthält. Wenn eine Seite beim Anzeigen nicht jedes Mal aktualisiert werden muss, sollten Sie die Browser- und Proxyzwischenspeicherung aktivieren. Dadurch können Browser und Proxys eine „zwischengespeicherte“ Kopie einer Seite für einen bestimmten, von Ihnen festgelegten Zeitraum verwenden. Durch Zwischenspeichern wird die Belastung des Servers drastisch reduziert, und Benutzer machen positivere Erfahrungen.

Welche dynamischen Seiten eignen sich zum Zwischenspeichern? Hierzu einige Beispiele:

  1. Eine Wetterseite, auf der das Wetter nur alle fünf Minuten aktualisiert wird.
  2. Eine Homepage mit Nachrichten oder Pressemitteilungen, die nur zweimal täglich aktualisiert wird.
  3. Ein Liste mit der Leistung von Fonds, deren Statistiken nur alle paar Stunden aktualisiert werden.

Beachten Sie, dass bei der Browser- oder Proxyzwischenspeicherung auf Ihrem Webserver weniger Treffer verzeichnet werden. Wenn Sie versuchen, alle Seitenansichten genau zu messen oder Werbung auf einer Website zu platzieren, machen Sie mit der Browser- oder Proxyzwischenspeicherung möglicherweise keine guten Erfahrungen.

Die Browserzwischenspeicherung wird vom HTTP-Header Expires gesteuert, der von einem Webserver an einen Browser gesendet wird. ASP stellt zwei einfache Mechanismen zum Senden dieses Headers bereit. Sie können die Seite so konfigurieren, dass sie nach einer bestimmten Anzahl von Minuten abläuft. Legen Sie dazu die Response.Expires-Eigenschaft fest. In folgendem Beispiel wird dem Browser mitgeteilt, dass der Inhalt nach 10 Minuten abläuft.

<% Response.Expires = 10 %>

Wenn Sie für Response.Expires eine negative Zahl oder Null festlegen, wird das Zwischenspeichern deaktiviert. Verwenden Sie auf jeden Fall eine große negative Zahl, z. B. -1000 (etwas mehr als ein Tag), um Unterschiede zwischen den Uhren auf dem Server und den Browsern zum umgehen. Eine zweite Eigenschaft, Response.ExpiresAbsolute, ermöglicht das Festlegen einer bestimmten Uhrzeit, zu der der Inhalt abläuft.

<% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>

Statt den Ablauf mit dem Response-Objekt festzulegen, können Sie ein <META>-Kennzeichen in HTML (normalerweise im Abschnitt <HEAD> der HTML-Datei) schreiben. Einige Browser respektieren diese Anweisung, Proxys jedoch nicht.

<META HTTP-EQUIV=„Expires“ VALUE=„May 31,2001 13:30:15“>

Zum Schluss können Sie noch angeben, ob der Inhalt für eine Zwischenspeicherung in einem HTTP-Proxy gültig ist. Verwenden Sie dazu die Response.CacheControl-Eigenschaft, und legen Sie sie auf Public fest, um Proxys das Zwischenspeichern des Inhalts zu ermöglichen.

<% Response.CacheControl = „Public“ %>

Diese Eigenschaft ist standardmäßig auf Private festgelegt. Beachten Sie, dass die Proxyzwischenspeicherung nicht für Seiten aktiviert werden sollte, die benutzerspezifische Daten anzeigen, da der Proxy möglicherweise Seiten anzeigt, die anderen Benutzern gehören.

ASP Tipp 22: Verwenden Sie, wenn möglich, Server.Transfer anstelle von Response.Redirect

Response.Redirect teilt dem Browser mit, eine andere Seite anzufordern. Diese Funktion wird häufig verwendet, um Benutzer zu einer Anmeldungs- oder Fehlerseite umzuleiten. Da eine Umleitung eine neue Seitenanforderung erzwingt, muss der Browser zwei Anfragen an den Webserver senden, und der Webserver muss eine zusätzliche Anfrage bewältigen. IIS 5.0 führt die neue Funktion Server.Transfer ein, die die Ausführung auf eine andere ASP-Seite auf dem gleichen Server überträgt. Dadurch wird die zusätzliche Anfrage des Browsers beim Server vermieden. Das Resultat ist eine insgesamt bessere Systemleistung, und Benutzer profitieren von besseren Antwortzeiten. Schlagen Sie in der Artikelreihe „New Directions in Redirection“ nach, in der Server.Transfer und Server.Execute behandelt werden.

Schlagen Sie außerdem in „Leveraging ASP in IIS 5.0“ nach. Dort erhalten Sie eine ausführliche Liste der neuen Funktionen in IIS 5.0 und ASP 3.0.

 

ASP Tipp 23: Verwenden Sie nachstehende Schrägstriche in Verzeichnis-URLs

In diesen Zusammenhang gehört auch der Tipp, in URLs, die auf Verzeichnisse verweisen, einen nachfolgenden Schrägstrich (/) zu verwenden. Wenn Sie den nachstehenden Schrägstrich auslassen, sendet der Browser eine Anfrage an den Server, der ihm mitteilt, dass er nach einem Verzeichnis fragt. Der Browser sendet dann eine zweite Anfrage, bei der dem URL ein Schrägstrich hinzugefügt wird. Der Server antwortet erst dann mit dem Standarddokument für dieses Verzeichnis, oder, wenn es kein Standarddokument gibt und die Verzeichnissuche aktiviert wurde, mit einer Verzeichnisliste. Durch Hinzufügen des Schrägstrichs wird die erste unnötige Anfrage vermieden. Aus Gründen der Benutzerfreundlichkeit können Sie den nachstehenden Schrägstrich in Anzeigenamen auslassen.

Schreiben Sie z. B. folgenden Code:

<a href=„http://msdn.microsoft.com/workshop/“ title=„MSDN Web Workshop“>http://msdn.microsoft.com/workshop</a>

Dies gilt auch für URLs, die in einer Website auf die Homepage verweisen.

Verwenden Sie folgenden Code: <a href=„http://msdn.microsoft.com/“>, not <a href=„http://msdn.microsoft.com“>.

ASP Tipp 24: Vermeiden Sie das Verwenden von Servervariablen

Beim Zugreifen auf Servervariablen sendet Ihre Website eine Sonderanfrage an den Server und sammelt alle Servervariablen, d. h. nicht nur die von Ihnen angeforderte. Dies kann mit der Suche nach einem spezifischen Dokument in einem Aktenordner, der sich irgendwo in Ihrem Keller befindet, verglichen werden. Wenn Sie dieses Dokument benötigen, müssen Sie den Aktenordner zuerst im Keller finden. Das Gleiche passiert, wenn Sie eine Servervariable anfordern; die Leistungseinbuße tritt auf, wenn Sie eine Servervariable zum ersten Mal anfordern. Nachfolgende Anforderungen von anderen Servervariablen führen nicht zu Leistungseinbußen.

 Greifen Sie nie uneingeschränkt auf das Request-Objekt zu (z. B. Request(„Data“)). Für Elemente, die nicht in Request.Cookies, Request.Form, Request.QueryString oder Request.ClientCertificate enthalten sind, wird implizit Request.ServerVariables aufgerufen. Die Request.ServerVariables-Auflistung ist wesentlich langsamer als andere Auflistungen.

 

ASP Tipp 25: Aktualisieren Sie auf die neueste und beste Version

Systemkomponenten werden ständig aktualisiert. Daher wird empfohlen, sie auf die neueste und beste Version zu aktualisieren. Eine Aktualisierung auf Windows 2000 (und somit auf IIS 5.0, ADO 2.5, MSXML 2.5, Internet Explorer 5.0, VBScript 5.1 und Jscript 5.1) wäre optimal. IIS 5.0 und ADO 2.5 implementieren bei Mehrprozessorcomputern spektakuläre Leistungszunahmen. Unter Windows 2000 wird ASP sehr gut auf vier oder mehr Prozessoren skaliert, während es unter IIS 4.0 bei mehr als zwei Prozessoren nicht besonders gut skaliert wurde. Je mehr Skriptcode und ADO in Ihrer Anwendung verwendet wird, desto stärker profitiert die Leistung von einer Aktualisierung auf Windows 2000.  

Wenn Sie noch nicht auf Windows 2000 aktualisieren können, können Sie dennoch auf die neuesten Versionen von SQL Server, ADO, VBScript und JScript, MSXML, Internet Explorer und NT 4 Service Packs aktualisieren. Alle diese warten mit besserer Leistung und höherer Zuverlässigkeit auf.

 

ASP Tipp 26: Optimieren Sie Ihren Webserver

Es gibt mehrere IIS-Optimierungsparameter, die die Siteleistung verbessern können. Bei IIS 4.0 führte ein Erhöhen des ASP-Parameters ProcessorThreadMax (siehe IIS-Dokumentation) in vielen Fällen, und insbesondere auf Sites, die auf Back-End-Ressourcen, wie Datenbanken, oder andere Middleware-Produkte, wie z. B. Screenscraper, warten, zu deutlichen Vorteilen. In IIS 5.0 werden Sie möglicherweise feststellen, dass es wesentlich effizienter ist, ASP Thread Gating zu aktivieren, als zu versuchen, eine optimale Einstellung für den jetzt als AspProcessorThreadMax bezeichneten Parameter zu finden.

Gute Nachschlagewerke finden Sie weiter unten unter „Optimieren von IIS“.  

Die optimalen Konfigurationseinstellungen ergeben sich (unter anderem) aus dem Anwendungscode, der Hardware- und der Clientarbeitsauslastung. Die einzige Möglichkeit, die optimalen Einstellungen zu ermitteln, ist das Ausführen von Leistungstest. Diese werden im nächsten Tipp behandelt.

 

ASP Tipp 27: Testen Sie die Leistung

Wie bereits weiter oben erwähnt, handelt es sich bei der Leistung um ein Merkmal. Wenn Sie versuchen, die Leistung auf einer Site zu verbessern, setzen Sie sich ein Leistungsziel, und machen Sie nach und nach Verbesserungen, bis Sie Ihr Ziel erreichen. Fähren Sie nicht alle Leistungstests am Ende des Projekts durch. Zu diesem Zeitpunkt ist es für die notwendigen Architekturänderungen oft zu spät, und Ihre Kunden werden enttäuscht. Fähren Sie Leistungstest im Rahmen der täglichen Testläufe durch. Sie können die Leistung einzelner Komponenten, wie z. B. von ASP-Seiten oder COM-Objekten, oder der Site insgesamt testen.

Viele Entwickler testen die Leistung ihrer Websites, indem sie Seiten mit einem einzelnen Browser anfordern. Dadurch erhalten Sie einen guten Eindruck von der Antwortfähigkeit Ihrer Site, haben aber keinen Einblick in die Funktionalität der Site bei starker Belastung.

Um die Leistung genau zu messen, benötigen Sie im Allgemeinen eine dedizierte Testumgebung. Diese Umgebung sollte Hardware umfassen, die der Produktionshardware in Bezug auf Prozessorgeschwindigkeit, Anzahl der Prozessoren, Arbeitsspeicher, Festplatte, Netzwerkkonfiguration usw. möglichst ähnlich ist. Danach müssen Sie die Clientarbeitsauslastung definieren: die Anzahl der gleichzeitigen Benutzer, die Häufigkeit der Anfragen durch die Benutzer, die Arten von Seiten, die diese anfordern usw. Wenn Sie keinen Zugang zu realistischen Gebrauchsdaten von Ihrer Site haben, müssen Sie diese schätzen. Zum Schluss benötigen Sie ein Tool, das die erwarteten Clientarbeitsauslastungen simulieren kann. Mit diesen Tools können Sie Fragen wie z. B. die folgende beantworten: „Wie viele Server werden für N simultane Benutzer benötigt?“ Sie können außerdem Engpässe vorhersehen und deren Optimierung planen.

Im Folgenden sind einige gute Webtools für Belastungstests aufgeführt. Microsoft Web Application Stress (WAS) Toolkit ist sehr empfehlenswert. Mit WAS können Sie Testskripts aufzeichnen und anschließend simulieren, dass Hunderte oder Tausende von Benutzern auf Ihre Webserver zugreifen. WAS gibt zahlreiche Statistiken aus, darunter die Anzahl der Anfragen pro Sekunde, die Verteilung der Antwortzeiten und Fehlerzahlen. Es verfügt sowohl über eine reichhaltige Client- als auch eine webbasierte Oberfläche. Die Weboberfläche ermöglicht die Remoteausführung von Tests.