Leistung ist ein Feature. Sie müssen die Leistung im Voraus entwickeln, sonst müssen Sie Ihre Anwendung später neu schreiben. Welche guten Strategien gibt es jedoch, um die Leistung von Active Server Pages (ASP)-Anwendungen zu maximieren?
In diesem Artikel werden Techniken zur Optimierung von ASP-Anwendungen und Visual Basic® Scripting Edition (VBScript) beschrieben. In diesem Artikel werden einige Fallstricke besprochen. Die in diesem Artikel aufgeführten Vorschläge wurden auf http://www.microsoft.com und anderen Websites getestet und die Ergebnisse waren sehr aussagekräftig. In diesem Artikel wird davon ausgegangen, dass Sie bereits über grundlegende Kenntnisse der ASP-Entwicklung verfügen, einschließlich VBScript und/oder JScript, ASP-Anwendung, ASP-Sitzung und anderen ASP-inhärenten Objekten (Anfrage, Antwort und Server).
Typischerweise hängt die ASP-Leistung in erster Linie von vielen anderen Faktoren als dem ASP-Code selbst ab. Anstatt alle Informationen in einem Artikel aufzulisten, listen wir am Ende des Artikels leistungsbezogene Ressourcen auf. Diese Links decken ASP- und Nicht-ASP-Themen ab, einschließlich ActiveX® Data Objects (ADO), Component Object Model (COM), Datenbanken und Internet Information Server (IIS)-Konfiguration. Dies sind einige unserer Lieblingslinks – schauen Sie sich sie unbedingt an.
Tipp 1: Zwischenspeichern häufig verwendeter Daten auf dem Webserver
Eine typische ASP-Seite ruft Daten aus einem Back-End-Datenspeicher ab und konvertiert die Ergebnisse dann in Hypertext Markup Language (HTML). Unabhängig von der Geschwindigkeit der Datenbank ist das Abrufen von Daten aus dem Speicher immer viel schneller als das Abrufen von Daten aus dem Back-End-Datenspeicher. Auch das Lesen von Daten von einer lokalen Festplatte ist im Allgemeinen schneller als das Abrufen von Daten aus einer Datenbank. Daher kann die Leistung häufig durch das Zwischenspeichern von Daten auf dem Webserver (im Speicher oder auf der Festplatte gespeichert) verbessert werden.
Caching ist die traditionelle Art, Raum gegen Zeit zu tauschen. Wenn Sie die richtigen Inhalte zwischenspeichern, können Sie eine deutliche Leistungsverbesserung feststellen. Damit das Caching effektiv ist, müssen häufig wiederverwendete Daten gespeichert werden, und die Neuberechnung dieser Daten erfordert einen (mäßig) großen Overhead. Wenn der Cache ausschließlich veraltete Daten enthält, führt dies zu Speicherverschwendung.
Daten, die sich selten ändern, eignen sich gut für die Zwischenspeicherung, da Sie sich nicht darum kümmern müssen, diese Daten im Laufe der Zeit mit der Datenbank zu synchronisieren. Kombinationsfeldlisten, Referenztabellen, DHTML-Fragmente, Extensible Markup Language (XML)-Zeichenfolgen, Menüelemente und Site-Konfigurationsvariablen (einschließlich Datenquellennamen (DSNs), Internet Protocol (IP)-Adressen und Webpfade) sind allesamt gute Cache-Kandidaten Inhalt. Beachten Sie, dass Sie eine „Darstellung“ der Daten zwischenspeichern können, ohne die Daten selbst zwischenzuspeichern. Wenn sich die ASP-Seite selten ändert und das Zwischenspeichern kostspielig ist (z. B. ein ganzer Produktkatalog), sollten Sie erwägen, den HTML-Code im Voraus zu generieren, anstatt ihn als Antwort auf jede Anfrage erneut anzuzeigen.
Wo sollen die Daten zwischengespeichert werden und welche Caching-Strategien gibt es? Typischerweise werden Daten im Speicher oder auf der Festplatte des Webservers zwischengespeichert. Die nächsten beiden Tipps behandeln beide Methoden.
Tipp 2: Zwischenspeichern häufig verwendeter Daten in Anwendungs- oder Sitzungsobjekten.
Anwendungs- und Sitzungsobjekte bieten praktische Container zum Zwischenspeichern von Daten im Speicher. Sie können Anwendungs- und Sitzungsobjekten Daten zuweisen, und die Daten bleiben zwischen HTTP-Aufrufen im Speicher. Sitzungsdaten werden für jeden Benutzer separat gespeichert, während Anwendungsdaten von allen Benutzern gemeinsam genutzt werden.
Wann sollten Daten in die Anwendung oder Sitzung geladen werden? Normalerweise werden Daten geladen, wenn die Anwendung oder Sitzung gestartet wird. Um Daten während des Anwendungs- oder Sitzungsstarts zu laden, fügen Sie entsprechenden Code zu Application_OnStart() bzw. Session_OnStart() hinzu. Diese Funktionen sollten in Global.asa enthalten sein. Andernfalls können Sie sie hinzufügen. Diese Daten können auch beim ersten Bedarf geladen werden. Fügen Sie dazu etwas Code zur ASP-Seite hinzu (oder schreiben Sie eine wiederverwendbare Skriptfunktion), um zu prüfen, ob die Daten vorhanden sind, und wenn nicht, laden Sie die Daten. Hierbei handelt es sich um eine traditionelle Leistungstechnik namens „Lazy Evaluation“, bei der ein Wert erst dann berechnet wird, wenn Sie wissen, dass Sie ihn benötigen. Zum Beispiel:
<%
Funktion GetEmploymentStatusList
Dim d
d = Bewerbung(?EmploymentStatusList?)
Wenn d = ??Dann
' FetchEmploymentStatusList-Funktion (nicht angezeigt)
' ruft Daten aus der Datenbank ab und gibt ein Array zurück
d = FetchEmploymentStatusList()
Application(?EmploymentStatusList?) = d
Ende wenn
GetEmploymentStatusList = d
Funktion beenden
%>
Für jeden benötigten Datenblock können ähnliche Funktionen geschrieben werden.
In welchem Format sollen die Daten gespeichert werden? Jeder Variantentyp kann gespeichert werden, da alle Skriptvariablen Variantentypen sind. Sie können beispielsweise Zeichenfolgen, Ganzzahlen oder Arrays speichern. Normalerweise speichern Sie den Inhalt eines ADO-Recordsets in einem dieser Variablentypen. Um Daten aus einem ADO-Recordset abzurufen, können Sie die Daten manuell feldweise in VBScript-Variablen kopieren. Es ist schneller und einfacher, eine der ADO-Recordset-Persistenzfunktionen GetRows(), GetString() oder Save() (ADO 2.5) zu verwenden. Die Details würden den Rahmen dieses Artikels sprengen, aber hier ist ein Beispiel einer Funktion, die GetRows() verwendet, um ein Array von Recordset-Daten zurückzugeben:
' Recordset abrufen, als Array zurückgeben
Funktion FetchEmploymentStatusList
Dimrs
Setze rs = CreateObject(?ADODB.Recordset?)
rs.Open ?Wählen Sie StatusName, StatusID aus EmployeeStatus aus?, _
?dsn=mitarbeiter;uid=sa;pwd=;?
FetchEmploymentStatusList = rs.GetRows() ? Daten als Array zurückgeben
rs.Schließen
Setrs=Nichts
End Function
verbessert das obige Beispiel weiter, indem HTML als Liste statt als Array zwischengespeichert wird. Hier ist ein einfaches Beispiel:
' Recordset abrufen, als HTML-Optionsliste zurückgeben
Funktion FetchEmploymentStatusList
Dim rs, fldName, s
Setze rs = CreateObject(?ADODB.Recordset?)
rs.Open ?Wählen Sie StatusName, StatusID aus EmployeeStatus aus?, _
?dsn=mitarbeiter;uid=sa;pwd=;?
s = ?<select name=??EmploymentStatus???& vbCrLf
Legen Sie fldName = rs.Fields(?StatusName?) ' ADO-Feldbindung fest
Bis rs.EOF tun
' Nächste Zeile verstößt gegen Don't Do String Concats,
', aber es ist in Ordnung, weil wir einen Cache erstellen
s = s & ? <option>? & fldName & ?</option>?
rs.MoveNext
Schleife
s = s & ?</select>? & vbCrLf
rs.Schließen
Setze rs = Nothing ' Siehe Frühzeitige Veröffentlichung
FetchEmploymentStatusList = s ' Daten als String zurückgeben
Funktion beenden
Unter geeigneten Bedingungen kann das ADO-Recordset selbst im Anwendungs- oder Sitzungsbereich zwischengespeichert werden. Es gibt zwei Einschränkungen:
ADO muss als Free-Threaded markiert sein und es müssen getrennte Recordsets verwendet werden.
Wenn diese beiden Anforderungen nicht gewährleistet sind, sollten Sie das ADO-Recordset nicht zwischenspeichern. In den folgenden Tipps zu „Nicht-agile Komponenten“ und „Verbindungen nicht zwischenspeichern“ besprechen wir die Gefahren der Speicherung von COM-Objekten im Anwendungs- oder Sitzungsbereich.
Wenn Sie Daten im Anwendungs- oder Sitzungsbereich speichern, bleiben die Daten dort, bis Sie sie programmgesteuert ändern, die Sitzung abläuft oder die Webanwendung neu gestartet wird. Was passiert, wenn die Daten aktualisiert werden müssen? Um eine Aktualisierung der Anwendungsdaten manuell zu erzwingen, können Sie auf eine ASP-Seite nur für Administratoren zugreifen, um die Daten zu aktualisieren. Alternativ können Sie die Daten über eine Funktion automatisch in regelmäßigen Abständen aktualisieren. Das folgende Beispiel speichert einen Zeitstempel mit zwischengespeicherten Daten und aktualisiert die Daten nach einem bestimmten Zeitraum.
<%
'Fehlerbehandlung nicht angezeigt...
Const UPDATE_INTERVAL = 300 ' Aktualisierungsintervall in Sekunden
' Funktion zur Rückgabe der Beschäftigungsstatusliste
Funktion GetEmploymentStatusList
Beschäftigungsstatus aktualisieren
GetEmploymentStatusList = Application(?EmploymentStatusList?)
End Function
' Die zwischengespeicherten Daten regelmäßig aktualisieren
Sub UpdateEmploymentStatusList
Dim d, strLastUpdate
strLastUpdate = Anwendung(?LastUpdate?)
If (strLastUpdate = ??) Oder _
(UPDATE_INTERVAL < DateDiff(?s?, strLastUpdate, Now)) Dann
' Hinweis: Hier können zwei oder mehr Anrufe eingehen. Das ist in Ordnung und wird einfach durchgeführt
' führt zu einigen unnötigen Abrufen (hierfür gibt es einen Workaround)
' FetchEmploymentStatusList-Funktion (nicht angezeigt)
' ruft Daten aus der Datenbank ab und gibt ein Array zurück
d = FetchEmploymentStatusList()
' Aktualisieren Sie das Anwendungsobjekt. Verwenden Sie Application.Lock().
', um konsistente Daten sicherzustellen
Anwendungssperre
Application(?EmploymentStatusList?) = Ereignisse
Anwendung(?LastUpdate?) = CStr(Jetzt)
Anwendung.Entsperren
Ende wenn
Sub beenden
Siehe „World's Fastest ListBox with Application Data“, wo es auch ein Beispiel gibt.
Beachten Sie, dass das Zwischenspeichern großer Arrays in Sitzungs- oder Anwendungsobjekten keine gute Praxis ist. Die Syntax der Skriptsprache erfordert, dass das gesamte Array vorübergehend kopiert werden muss, bevor auf ein Element des Arrays zugegriffen werden kann. Wenn Sie beispielsweise ein 100.000 Elemente umfassendes String-Array zwischenspeichern, das US-Postleitzahlen lokalen Wetterstationen in einem Anwendungsobjekt zuordnet, muss ASP zunächst alle 100.000 Wetterstationen in ein temporäres Array kopieren. Erst dann kann ein String extrahiert werden. In diesem Fall wäre es besser, eine benutzerdefinierte Komponente mit einer benutzerdefinierten Methode zum Speichern der Wetterstation zu erstellen – oder eine Wörterbuchkomponente zu verwenden.
Noch eine Warnung: Schütten Sie das Baby nicht mit dem Bade aus: Arrays können schnell nachgeschlagen und als benachbarte Schlüsseldatenpaare im Speicher gespeichert werden. Das Indizieren eines Wörterbuchs ist viel langsamer als das Indizieren eines Arrays. Sie sollten die Datenstruktur wählen, die für Ihre Situation die beste Leistung bietet.
Tipp 3: Zwischenspeichern von Daten und HTML auf der Festplatte des Webservers
Manchmal können zu viele Daten im Speicher zwischengespeichert werden. „Zu viele“ ist nur eine Art zu sagen, dass es davon abhängt, wie viel Speicher Sie verbrauchen möchten, wie viele Elemente Sie zwischenspeichern müssen und wie oft Sie sie abrufen möchten. Wenn die Datenmenge zu groß ist, um im Speicher zwischengespeichert zu werden, sollten Sie in jedem Fall in Betracht ziehen, die Daten auf der Festplatte des Webservers als Text- oder XML-Datei zwischenzuspeichern. Daten können gleichzeitig auf der Festplatte und im Speicher zwischengespeichert werden, um die am besten geeignete Caching-Strategie für Ihre Site festzulegen.
Beachten Sie, dass beim Messen der Leistung einer einzelnen ASP-Seite das Abrufen von Daten von der Festplatte möglicherweise nicht unbedingt schneller ist als das Abrufen von Daten aus einer Datenbank. Aber Caching reduziert die Belastung der Datenbank und des Netzwerks. Unter hoher Last kann dies den Gesamtdurchsatz erheblich verbessern. Dies ist sehr effektiv, wenn die Ergebnisse teurer Abfragen (z. B. Verknüpfungen mehrerer Tabellen oder zusammengesetzter gespeicherter Prozeduren) oder großer Ergebnismengen zwischengespeichert werden. Testen Sie wie immer die Vor- und Nachteile verschiedener Optionen.
ASP und COM bieten Tools zum Einrichten festplattenbasierter Caching-Lösungen. Die ADO-Recordset-Funktionen Save() und Open() speichern und laden Recordsets von der Festplatte. Sie können diese Methoden verwenden, um das Codebeispiel in der oben beschriebenen Anwendungsdaten-Caching-Technik neu zu schreiben, indem Sie Save() der Datei verwenden, anstatt den Code in das Anwendungsobjekt zu schreiben.
Es gibt einige andere Komponenten, die mit Dateien arbeiten:
Mit Scripting.FileSystemObject können Sie Dateien erstellen, lesen und schreiben.
Der mit Internet Explorer bereitgestellte Microsoft® XML-Parser (MSXML) unterstützt das Speichern und Laden von XML-Dokumenten.
Das LookupTable-Objekt (z. B. auf MSN verwendet) ist die beste Wahl zum Laden einfacher Listen von der Festplatte.
Erwägen Sie schließlich, eine Darstellung der Daten auf der Festplatte zwischenzuspeichern und nicht die Daten selbst. Der vorkonvertierte HTML-Code kann in .htm- oder .asp-Dateien auf der Festplatte gespeichert werden, und Hyperlinks können direkt auf diese Dateien verweisen. Sie können kommerzielle Tools wie XBuilder oder die Microsoft® SQL Server® Internet Publishing-Funktion verwenden, um den Prozess der HTML-Generierung zu automatisieren. Alternativ können Sie den HTML-Codeausschnitt in einer .asp-Datei platzieren. Sie können FileSystemObject auch verwenden, um HTML-Dateien von der Festplatte zu lesen, oder XML verwenden, um sie frühzeitig zu konvertieren.
Tipp 4: Vermeiden Sie das Zwischenspeichern nicht agiler Komponenten in Anwendungs- oder Sitzungsobjekten.
Obwohl das Zwischenspeichern von Daten in Anwendungs- oder Sitzungsobjekten eine gute Praxis ist, birgt das Zwischenspeichern von COM-Objekten ernsthafte Gefahren. Normalerweise tendieren Benutzer dazu, häufig verwendete COM-Objekte in Anwendungs- oder Sitzungsobjekten zwischenzuspeichern. Leider verursachen viele COM-Objekte (einschließlich aller in Visual Basic 6.0 oder früher geschriebenen Objekte) ernsthafte Engpässe, wenn sie in Anwendungs- oder Sitzungsobjekten gespeichert werden.
Insbesondere wenn eine nicht agile Komponente im Sitzungs- oder Anwendungsobjekt zwischengespeichert wird, führt dies zu einem Leistungsengpass. Eine agile Komponente ist eine mit ThreadingModel=Both gekennzeichnete Komponente, die einen Free-Threaded-Marshaler (FTM) aggregiert, oder eine mit ThreadingModel=Neutral gekennzeichnete Komponente. (Das Neutral-Modell ist neu für Windows® 2000 und COM+.) Die folgenden Komponenten sind nicht agil:
Free-Threaded-Komponenten (es sei denn, sie aggregieren FTM).
Apartment-Thread-Komponenten.
Komponente mit einem Gewinde.
Konfigurierte Komponenten (Microsoft Transaction Server (MTS)/COM+-Bibliotheken und Serverpakete/-anwendungen) sind nicht agil, es sei denn, es handelt sich um neutrale Threads. Apartment-Thread-Komponenten und andere nicht agile Komponenten eignen sich am besten für den Seitenbereich (d. h. sie werden auf einer einzelnen ASP-Seite erstellt und zerstört).
In IIS 4.0 gelten Komponenten, die mit ThreadingModel=Both gekennzeichnet sind, als agil. In IIS 5.0 reicht dies allein nicht aus. Komponenten müssen nicht nur als „Beide“ gekennzeichnet sein, sondern auch als „FTM“ aggregiert sein. Der Artikel über Agilität beschreibt, wie man FTM mit C++-Komponenten aggregiert, die in der Active Template Library geschrieben sind. Beachten Sie, dass, wenn eine Komponente Schnittstellenzeiger zwischenspeichert, diese Zeiger selbst agil sein oder in der COM Common Interface Table (GIT) gespeichert sein müssen. Wenn Sie eine Both-Thread-Komponente nicht neu kompilieren können, um FTM zu aggregieren, können Sie die Komponente mit ThreadingModel=Neutral markieren. Wenn Sie nicht möchten, dass IIS Agilitätsprüfungen durchführt (daher können Sie die Speicherung nicht agiler Komponenten im Anwendungs- oder Sitzungsbereich zulassen), können Sie alternativ AspTrackThreadingModel in der Metabasis auf „True“ festlegen. Das Ändern von AspTrackThreadingModel wird nicht empfohlen.
IIS 5.0 gibt einen Fehler aus, wenn Sie eine nicht agile Komponente, die mit Server.CreateObject erstellt wurde, in einem Anwendungsobjekt speichern möchten. Sie können diesen Fehler vermeiden, indem Sie <object runat=serverscope=application ...> in Global.asa verwenden. Dies wird jedoch nicht empfohlen, da es zu Pooling und Serialisierung führen kann, wie unten beschrieben.
Was passiert, wenn Sie nicht agile Komponenten zwischenspeichern? Nicht-agile Komponenten, die im Sitzungsobjekt zwischengespeichert sind, sperren die Sitzung für den ASP-Arbeitsthread. ASP verwaltet einen Pool von Arbeitsthreads zur Bearbeitung von Anforderungen. Normalerweise wird eine neue Anfrage immer vom ersten verfügbaren Arbeitsthread bearbeitet. Wenn die Sitzung an einen Thread gebunden ist, muss die Anforderung warten, bis der zugehörige Thread verfügbar ist. Hier ist eine Analogie, die hilfreich sein könnte: Sie gehen in einen Supermarkt, suchen sich ein paar Artikel aus und bezahlen an der Kasse #_3. Wenn Sie danach in diesem Supermarkt einen Artikel bezahlen, müssen Sie immer an der Kasse #_3 bezahlen, auch wenn es an anderen Kassen weniger oder keine Warteschlangen gibt.
Das Speichern nicht agiler Komponenten im Anwendungsbereich hat noch schlimmere Auswirkungen auf die Leistung. ASP muss einen speziellen Thread erstellen, um nicht agile Komponenten auszuführen, die im Anwendungsbereich gespeichert sind. Dies hat zwei Konsequenzen: Alle Anrufe müssen an diesen Thread weitergeleitet werden und alle Anrufe werden in die Warteschlange gestellt. „Pooling“ bedeutet, dass die Parameter in einem gemeinsam genutzten Speicherbereich gespeichert werden müssen; führen Sie die Methode der Komponente aus und führen Sie einen weiteren teuren Kontextwechsel durch zum Originalthread. „Serialisierung“ bedeutet, dass jeweils nur eine Methode ausgeführt wird. Zwei verschiedene ASP-Worker-Threads können nicht mehrere Methoden gleichzeitig auf einer gemeinsam genutzten Komponente ausführen. Dies eliminiert Parallelität, insbesondere auf Computern mit mehreren Prozessoren. Erschwerend kommt hinzu, dass alle nicht auf die Agile-Anwendung beschränkten Komponenten einen einzigen Thread (den Host-STA) gemeinsam nutzen, sodass die Auswirkungen der Serialisierung noch bedeutender sind.
Was kann ich tun? Hier sind einige allgemeine Regeln. Wenn Sie Objekte mit Visual Basic (6.0) oder früher schreiben, sollten Sie sie nicht in Anwendungs- oder Sitzungsobjekten zwischenspeichern. Wenn Sie das Threading-Modell eines Objekts nicht kennen, sollten Sie es nicht zwischenspeichern. Nicht-agile Objekte nicht zwischenspeichern, sondern auf jeder Seite erstellen und freigeben. Objekte werden direkt im ASP-Worker-Thread ausgeführt, sodass kein Pooling oder Serialisierung erfolgt. Wenn die COM-Objekte auf einem IIS-Server ausgeführt werden, ist die Leistung akzeptabel, wenn das Initialisieren und Löschen nicht lange dauert. Beachten Sie, dass Single-Thread-Objekte nicht auf diese Weise verwendet werden sollten. Seien Sie vorsichtig – VB kann Single-Threaded-Objekte erstellen! Wenn Sie ein solches Single-Thread-Objekt (z. B. eine Microsoft Excel-Tabelle) verwenden müssen, dürfen Sie keinen hohen Durchsatz erwarten.
Wenn ADO als Free-Threaded markiert ist, können ADO-Recordsets sicher zwischengespeichert werden. Um ADO als Free-Threaded zu markieren, verwenden Sie die Datei Makfre15.bat, die sich normalerweise im Verzeichnis \Programme CommonSystemADO befindet.
Warnung: Wenn Sie Microsoft Access als Datenbank verwenden, sollten Sie ADO nicht als Free-Threaded markieren. Das ADO-Recordset muss ebenfalls getrennt werden. Wenn Sie die ADO-Konfiguration auf Ihrer Site nicht kontrollieren (z. B. wenn Sie ein unabhängiger Softwareanbieter [ISV] sind, der Webanwendungen an Kunden verkauft, die ihre eigenen Konfigurationen verwalten), ist es im Allgemeinen am besten, Recordsets nicht zwischenzuspeichern.
Wörterbuchkomponenten sind ebenfalls agile Objekte. LookupTable lädt seine Daten aus einer Datendatei und kann für Kombinationsfelddaten und Konfigurationsinformationen verwendet werden. Das PageCache-Objekt in Duwamish Books bietet Wörterbuchsyntax, ebenso wie das Caprock Dictionary. Diese Objekte oder ihre abgeleiteten Objekte können die Grundlage einer effektiven Caching-Strategie bilden. Beachten Sie, dass Scripting.Dictionary-Objekte nicht agil sind und nicht in Anwendungs- oder Sitzungsbereichen gespeichert werden sollten.
Tipp 5: Datenbankverbindungen nicht im Anwendungs- oder Sitzungsobjekt zwischenspeichern
. Das Zwischenspeichern von ADO-Verbindungen ist im Allgemeinen eine schlechte Strategie. Wenn ein Verbindungsobjekt im Anwendungsobjekt gespeichert und auf allen Seiten verwendet wird, konkurrieren alle Seiten um diese Verbindung. Wenn das Connection-Objekt im ASP-Session-Objekt gespeichert ist, wird für jeden Benutzer eine Datenbankverbindung erstellt. Dadurch werden die Vorteile des Verbindungspoolings zunichte gemacht und der Webserver und die Datenbank unnötig belastet.
Anstatt Datenbankverbindungen zwischenzuspeichern, können Sie ADO-Objekte auf jeder ASP-Seite erstellen und löschen, die ADO verwendet. Dies ist effizient, da IIS über ein integriertes Datenbankverbindungspooling verfügt. Genauer gesagt aktiviert IIS automatisch das OLEDB- und ODBC-Verbindungspooling. Dadurch wird sichergestellt, dass auf jeder Seite erstellte und gelöschte Verbindungen gültig sind.
Da das verbundene Recordset einen Verweis auf die Datenbankverbindung speichert, sollten Sie das verbundene Recordset nicht im Anwendungs- oder Sitzungsobjekt zwischenspeichern. Sie können jedoch getrennte Recordsets, die keinen Verweis auf ihre Datenverbindung enthalten, sicher zwischenspeichern. Um ein Recordset zu trennen, führen Sie die folgenden zwei Schritte aus:
Set rs = Server.CreateObject(?ADODB.RecordSet?)
rs.CursorLocation = adUseClient ' Schritt 1
' Füllen Sie das Recordset mit Daten
rs.Open strQuery, strProv
' Trennen Sie nun das Recordset vom Datenanbieter und der Datenquelle
rs.ActiveConnection = Nichts ' Schritt 2
Ausführlichere Informationen zum Verbindungspooling finden Sie im Referenzmaterial zu ADO und SQL Server.
Tipp 6: Sitzungsobjekte richtig verwenden
Nachdem wir nun die Vorteile des Cachings in Anwendungen und Sitzungen besprochen haben, wollen wir uns mit der Vermeidung der Verwendung von Sitzungsobjekten befassen. Wie weiter unten erläutert, hat Session mehrere Nachteile, wenn es an stark ausgelasteten Standorten verwendet wird. „Ausgelastet“ bezeichnet im Allgemeinen eine Website, die Hunderte von Seiten pro Sekunde oder Tausende gleichzeitiger Benutzer benötigt. Dieser Tipp ist umso wichtiger für Websites, die horizontal skaliert werden müssen – also solche, die mehrere Server nutzen, um die Last zu bewältigen oder Fehlertoleranz zu erreichen. Wenn Sie bei kleineren Sites wie Intranet-Sites die Vorteile von Session nutzen möchten, erhöht sich zwangsläufig der Systemaufwand.
Kurz gesagt: ASP erstellt automatisch eine Sitzung für jeden Benutzer, der auf den Webserver zugreift. Jede Sitzung erfordert etwa 10 KB Speicheraufwand (Hauptsache, die Daten werden in der Sitzung gespeichert), was alle Anfragen verlangsamt. Die Sitzung bleibt gültig, bis der konfigurierte Timeout-Zeitraum (normalerweise 20 Minuten) abgelaufen ist.
Das größte Problem bei Session ist nicht die Leistung, sondern die Skalierbarkeit. Eine Sitzung kann sich nicht über mehrere Webserver erstrecken. Sobald eine Sitzung auf einem Server erstellt wird, bleiben ihre Daten dort. Das heißt, wenn Sie Session in einer Webserverfarm verwenden, müssen Sie eine Richtlinie entwerfen, die jede Benutzeranfrage immer an den Server sendet, auf dem sich die Sitzung des Benutzers befindet. Dies wird als „Kleben“ des Benutzers an den Webserver bezeichnet. Daraus leitet sich der Begriff „Sticky Session“ ab. Wenn der Webserver abstürzt, verlieren „hängen gebliebene“ Benutzer ihren Sitzungsstatus, da die Sitzung nicht auf der Festplatte hängen bleibt.
Zu den Strategien zum Erreichen von Sticky Sessions gehören Hardware- und Softwarelösungen. Lösungen wie Network Load Balancing in Windows 2000 Advanced Server und Cisco Local Director können Sticky Sessions auf Kosten einer gewissen Skalierbarkeit implementieren. Diese Lösungen sind unvollkommen. Es wird derzeit nicht empfohlen, eine eigene Softwarelösung bereitzustellen (früher haben wir ISAPI-Filter und URL-Transformationen usw. verwendet).
Anwendungsobjekte erstrecken sich auch nicht über mehrere Server; wenn Sie Anwendungsdaten über eine Farm von Webservern hinweg teilen und aktualisieren müssen, müssen Sie eine Back-End-Datenbank verwenden. Allerdings sind schreibgeschützte Anwendungsdaten in einer Webserverfarm weiterhin nützlich.
Die meisten geschäftskritischen Standorte erfordern mindestens zwei Webserver, und sei es nur, um die Betriebszeit zu erhöhen (für Failover und Serverwartung). Daher müssen Sie beim Entwerfen geschäftskritischer Anwendungen „Sticky Sessions“ implementieren oder einfach die Verwendung von Sessions und anderen Statusverwaltungstechnologien vermeiden, die den Benutzerstatus auf einem einzelnen Webserver speichern.
Wenn Sie keine Sitzungen verwenden, schließen Sie diese unbedingt. Sie können dies für eine Anwendung über den Internet Services Manager tun (siehe ISM-Dokumentation). Wenn Sie sich für die Verwendung von Sitzungen entscheiden, gibt es Möglichkeiten, deren Auswirkungen auf die Leistung abzumildern.
Sie können Inhalte, für die keine Sitzung erforderlich ist (z. B. Hilfebildschirme, Besucherbereiche usw.), in eine andere ASP-Anwendung verschieben, bei der die Sitzung geschlossen ist. Sie können ASP Seite für Seite mitteilen, dass Sie das Session-Objekt auf dieser Seite nicht mehr benötigen, indem Sie die folgende Anweisung oben auf der ASP-Seite verwenden:
<% @EnableSessionState=False %>
Ein guter Grund, dies zu verwenden Die Richtlinie besagt, dass diese Sitzung ein interessantes Problem mit Framesets hat. ASP garantiert, dass in der Sitzung zu jedem Zeitpunkt nur eine Anfrage ausgeführt wird. Dadurch wird sichergestellt, dass, wenn der Browser mehrere Seiten für einen Benutzer anfordert, jeweils nur eine ASP-Anfrage die Sitzung berührt, wodurch Multithreading-Probleme vermieden werden, die beim Zugriff auf das Sitzungsobjekt auftreten. Leider werden alle Seiten in einem Frameset nacheinander und nicht gleichzeitig angezeigt. Benutzer müssen möglicherweise lange warten, bis sie alle Frames sehen. Moral der Geschichte: Wenn einige Frameset-Seiten nicht auf Session angewiesen sind, teilen Sie ASP dies unbedingt mit der Direktive @EnableSessionState=False mit.
Es gibt viele Möglichkeiten, den Sitzungsstatus zu verwalten, die die Verwendung von Sitzungsobjekten ersetzen können. Für kleine Statusmengen (weniger als 4 KB) empfehlen wir generell die Verwendung von Cookies, QueryString-Variablen und impliziten Variablen. Für größere Datenmengen, wie zum Beispiel Warenkörbe, ist eine Backend-Datenbank die beste Wahl. Es wurde viel über Zustandsverwaltungstechniken in Webserverfarmen geschrieben. Weitere Informationen finden Sie unter Sitzungsstatusreferenz.
Tipp 7: Kapseln Sie Code in COM-Objekten.
Wenn Sie viel VBScript oder JScript haben, können Sie die Leistung häufig verbessern, indem Sie Ihren Code in kompilierte COM-Objekte verschieben. Kompilierter Code wird normalerweise schneller ausgeführt als interpretierter Code. Kompilierte COM-Objekte können über die „frühe Bindung“ auf andere COM-Objekte zugreifen. Dabei handelt es sich um eine effizientere Methode zum Aufrufen von COM-Objekten als die von Skripten verwendete „späte Bindung“.
Das Kapseln von Code in COM-Objekten hat (neben der Leistung) mehrere Vorteile:
COM-Objekte helfen dabei, Präsentationslogik von Geschäftslogik zu trennen.
COM-Objekte stellen die Wiederverwendung von Code sicher.
Viele Entwickler sind der Meinung, dass in VB, C++ oder Visual J++ geschriebener Code einfacher zu debuggen ist als ASP.
COM-Objekte haben auch Nachteile, einschließlich der anfänglichen Entwicklungszeit und der Notwendigkeit unterschiedlicher Programmierkenntnisse. Beachten Sie, dass die Kapselung einer kleinen Menge ASP zu Leistungseinbußen führen kann, ohne dass sich die Leistung verbessert. Diese Situation tritt normalerweise auf, wenn eine kleine Menge ASP-Code in ein COM-Objekt gekapselt ist. In diesem Fall überwiegt der Aufwand für das Erstellen und Aufrufen des COM-Objekts die Vorteile des kompilierten Codes. Durch Versuch und Irrtum sollte ermittelt werden, welche Kombination aus ASP-Skript und COM-Objektcode die beste Leistung erzielt. Beachten Sie, dass es in Windows 2000/IIS 5.0 im Vergleich zu Microsoft Windows NT® erhebliche Verbesserungen bei der Skripterstellung und der ADO-Leistung gibt. Daher hat sich mit der Einführung von IIS 5.0 der Leistungsvorteil von kompiliertem Code gegenüber ASP-Code verringert.
Eine ausführliche Diskussion der Vor- und Nachteile der Verwendung von COM in ASP finden Sie unter ASP Component Guidelines and Programming Distributed Applications with and Microsoft Visual Basic 6.0. Wenn Sie COM-Komponenten bereitstellen, ist es besonders wichtig, diese unter Last zu testen. Tatsächlich sollten alle ASP-Anwendungen selbstverständlich einem Lasttest unterzogen werden.
Tipp 8: Besorgen Sie sich Ressourcen später und geben Sie sie früher frei.
Hier ist ein kleiner Tipp als Referenz. Im Allgemeinen ist es besser, Ressourcen später zu beschaffen und früher freizugeben. Dies gilt sowohl für COM-Objekte als auch für Dateihandles und andere Ressourcen.
Diese Optimierungsmethode wird hauptsächlich für ADO-Verbindungen und Recordsets verwendet. Wenn Sie mit einem Recordset fertig sind, beispielsweise nachdem Sie eine Tabelle und ihre Daten angezeigt haben, sollten Sie es sofort freigeben, anstatt bis zum Ende der Seite zu warten. Es empfiehlt sich, die VBScript-Variable auf Nothing zu setzen. Lassen Sie nicht zu, dass ein Recordset den Gültigkeitsbereich verlässt. Geben Sie außerdem alle zugehörigen Befehls- oder Verbindungsobjekte frei (vergessen Sie nicht, Close() aufzurufen, bevor Sie das Recordset oder die Verbindung auf = Nothing setzen). Dies verkürzt die Zeit, die die Datenbank benötigt, um Ressourcen für Sie vorzubereiten, und gibt die Datenbankverbindung zum Verbindungspool so schnell wie möglich frei.
Tipp 9: Out-of-Process-Ausführung tauscht Leistung gegen Zuverlässigkeit ein.
Sowohl ASP als auch MTS/COM+ verfügen über Konfigurationsoptionen, mit denen Sie Zuverlässigkeit gegen Leistung abwägen können. Beim Erstellen und Bereitstellen von Anwendungen sollten Sie wissen, wie Sie die Leistung mit beiden in Einklang bringen können.
ASP-Optionen konfigurieren ASP-Anwendungen so, dass sie auf eine von drei Arten ausgeführt werden. In IIS 5.0 wurde der Begriff „Isolationsebene“ eingeführt, um diese Optionen zu beschreiben. Die drei Isolationsstufen sind Low-Level, Medium-Level und High-Level:
Isolation auf niedrigem Niveau. Dies wird in allen IIS-Versionen unterstützt und ist die schnellste. Es führt ASP in Inetinfo.exe aus, dem Haupt-IIS-Prozess. Wenn die ASP-Anwendung abstürzt, stürzt auch IIS ab. (Um IIS unter IIS 4.0 neu zu starten, sollte der Website-Administrator die Site mit einem Tool wie InetMon überwachen und eine Batchdatei aktivieren, um den Server neu zu starten, wenn der Server ausfällt. IIS 5.0 führte einen zuverlässigen Neustart ein, eine Methode zum automatischen Neustart eines ausgefallenen Servers ).
Zwischenisolation. Mit IIS 5.0 wurde diese neue Ebene eingeführt, die als Out-of-Process-Ebene bezeichnet wird, da ASP außerhalb des IIS-Prozesses ausgeführt wird. Bei der Zwischenisolation teilen sich alle ASP-Anwendungen, die für die Ausführung als Zwischenisolation konfiguriert sind, einen Prozessraum. Dies reduziert die Anzahl der Prozesse, die zum Ausführen mehrerer Out-of-Process-ASP-Anwendungen auf einem einzelnen Server erforderlich sind. Mittlere Isolation ist die Standardisolationsstufe in IIS 5.0.
Erweiterte Isolierung. Diese Ebene wird in IIS 4.0 und IIS 5.0 unterstützt, und die erweiterte Isolierung erfolgt auch außerhalb des Prozesses. Wenn ASP abstürzt, stürzt der Webserver nicht ab. Die ASP-Anwendung wird bei der nächsten ASP-Anfrage automatisch neu gestartet. Bei der erweiterten Isolation wird jede ASP-Anwendung, die für die Ausführung als erweiterte Isolation konfiguriert ist, in ihrem eigenen Prozessraum ausgeführt. Dadurch werden ASP-Anwendungen davor geschützt, sich gegenseitig zu stören. Der Nachteil besteht darin, dass für jede ASP-Anwendung ein separater Prozess erforderlich ist. Wenn viele Anwendungen auf einem einzigen Server ausgeführt werden müssen, erhöht sich der Systemaufwand erheblich.
Welche Option ist die beste? In IIS 4.0 wird die Leistung erheblich beeinträchtigt, wenn der Prozess ausgeht. In IIS 5.0 wurden viele Verbesserungen vorgenommen, um den Overhead zu minimieren, der durch die Ausführung von ASP-Anwendungen außerhalb des Prozesses entsteht. Tatsächlich liefen in den meisten Tests ASP-Out-of-Process-Anwendungen in IIS 5.0 schneller als In-Process-Anwendungen in IIS 4.0. Unabhängig davon schneidet In-Process (niedrige Isolationsstufe) auf beiden Plattformen am besten ab. Wenn jedoch die Zugriffsrate relativ niedrig oder der maximale Durchsatz niedrig ist, sind die Vorteile einer niedrigen Isolationsstufe weniger offensichtlich. Daher ist das Festlegen einer niedrigen Isolationsstufe möglicherweise nur dann erforderlich, wenn Sie Hunderte oder Tausende von Seiten pro Sekunde pro Webserver benötigen. Testen Sie wie immer mehrere Konfigurationen, um festzustellen, welchen Kompromiss Sie eingehen möchten.
Beachten Sie, dass beim Ausführen von ASP-Out-of-Process-Anwendungen (mittlere oder hohe Isolation) diese in MTS in NT4 und in COM+ in Windows 2000 ausgeführt werden. Das heißt, in NT4 laufen sie in Mtx.exe; in Windows 2000 laufen sie in DllHost.exe. Sie können sehen, wie diese Prozesse im Task-Manager ausgeführt werden. Sie können auch sehen, wie IIS ein MTS-Paket oder eine COM+-Anwendung für eine Out-of-Process-ASP-Anwendung konfiguriert.
COM-Optionen COM-Komponenten verfügen ebenfalls über drei Konfigurationsoptionen, obwohl diese den ASP-Optionen nicht genau ähneln. COM-Komponenten können „unkonfiguriert“, als Bibliotheksanwendung oder als Serveranwendung konfiguriert sein. „Unkonfiguriert“ bedeutet, dass die Komponente nicht bei COM+ registriert ist. Komponenten werden im Prozessraum des aufrufenden Programms ausgeführt, das heißt, sie sind „in Bearbeitung“. Bibliotheksanwendungen sind ebenfalls in Bearbeitung, nutzen jedoch COM+-Dienste, einschließlich Sicherheit, Transaktionen und Kontextunterstützung. Serveranwendungen sind so konfiguriert, dass sie in ihrem eigenen Prozessraum ausgeführt werden.
Sie sehen, dass unkonfigurierte Komponenten leichte Vorteile gegenüber Bibliotheksanwendungen haben. Bibliotheksanwendungen haben größere Leistungsvorteile als Serveranwendungen. Dies liegt daran, dass Bibliotheksanwendungen im selben Prozess wie ASP ausgeführt werden, während Serveranwendungen in ihren eigenen Prozessen ausgeführt werden. Interprozessaufrufe sind teurer als prozessinterne Aufrufe. Darüber hinaus müssen beim Übergeben von Daten wie Recordsets zwischen Prozessen alle Daten zwischen den beiden Prozessen kopiert werden.
fangen! Wenn Sie bei Verwendung einer COM-Serveranwendung Objekte zwischen ASP und COM übergeben, stellen Sie sicher, dass die Objekte „Bundle by Value“ oder MBV ausführen. Objekte, die MBV ausführen, kopieren sich selbst von einem Prozess zum anderen. Dies ist besser als ein Ansatz, bei dem sich das Objekt noch im Prozess des Erstellers befindet und ein anderer Prozess den Erstellungsprozess wiederholt aufruft, um das Objekt zu verwenden. Ein getrennter ADO-Recordset wird „nach Wert gruppiert“, ein verbundener Recordset jedoch nicht. Scripting.Dictionary führt keine MBV durch und wird nicht zwischen Prozessen weitergegeben. Abschließend noch ein Hinweis für VB-Programmierer: MBV wird nicht durch Übergabe des Parameters ByVal ermittelt. MBV wird vom ursprünglichen Komponentenautor durchgeführt.
was zu tun?
Wenn wir gebeten würden, eine vernünftige Konfiguration vorzuschlagen, die Leistung und Zuverlässigkeit in Einklang bringt, wären dies die folgenden:
Verwenden Sie in IIS 4.0 die niedrige Isolationsstufe ASP und das MTS-Serverpaket.
Verwenden Sie unter IIS 5.0 die mittlere Isolationsstufe von ASP und eine COM+-Bibliotheksanwendung.
Dabei handelt es sich um sehr allgemeine Grundsätze; Hosting-Unternehmen betreiben ASP typischerweise auf mittleren oder hohen Isolationsstufen, während Einzweck-Webserver auf niedrigen Isolationsstufen laufen können. Wägen Sie die Vor- und Nachteile ab und entscheiden Sie selbst, welche Konfiguration Ihren Anforderungen besser entspricht.
Tipp 10: Verwenden Sie die Option Explizite Optionen,
die explizit in .asp -Dateien verwendet werden sollte. Diese Richtlinie befindet sich oben in der .asp -Datei und zwingt den Entwickler, alle zu verwendenden Variablen zu deklarieren. Viele Programmierer finden diese Methode bei Debugging -Anwendungen hilfreich, da sie die Möglichkeit vermeidet, Variablennamen zu verwandeln und versehentlich neue Variablen zu erstellen (z. B. myxmlstring =) anstelle von myxlmstring = ....
Vielleicht noch wichtiger ist, dass deklarierte Variablen schneller sind als nicht deklarierte Variablen. Auf diese Weise verweist es jedes Mal, wenn das Skript zur Laufzeit eine nicht deklarierte Variable verwendet. Andererseits werden Variablen entweder zur Kompilierungszeit oder zur Laufzeit deklariert. Von nun an werden deklarierte Variablen in dieser Reihenfolge verwiesen. Da die Option Explicit Forces Variable Deklaration durch die Option Kräfte kräftigt, wird sichergestellt, dass alle Variablen deklariert werden, sodass der Zugriff schnell ist.
Tipp 11: Verwenden Sie lokale Variablen in Unterroutinen und Funktionen
Lokale Variablen sind jene Variablen, die in Unterroutinen und Funktionen deklariert sind. Innerhalb einer Funktion oder einer Unterroutine ist der lokale variable Zugriff schneller als der globale variable Zugriff. Die Verwendung lokaler Variablen macht auch den Code klarer, sodass lokale Variablen nach Möglichkeit verwendet werden sollten.
Tipp 12: Kopieren Sie häufig verwendete Daten in Skriptvariablen,
wenn Sie auf COM -Objekte in ASP zugreifen, häufig verwendete Objektdaten sollten in Skriptvariablen kopiert werden. Wenn Sie dies tun, werden COM -Methodenaufrufe reduziert, die im Vergleich zum Zugriff auf Skriptvariablen relativ teuer sind. Diese Technik reduziert auch teure Lookups, wenn er auf Sammlungs- und Wörterbuchobjekte zugreift.
Wenn Sie vorhaben, mehrmals auf Objektdaten zugreifen zu können, sollten Sie die Daten in Skriptvariablen einfügen. Das Hauptziel dieser Optimierung sind die Anforderungsvariablen (Formular- und QueryString -Variablen). Beispielsweise kann Ihre Website eine QueryString -Variable namens UserID übergeben. Nehmen wir an, auf diese BenutzerID wird auf einer bestimmten Seite 12 -mal verwiesen. Anstatt die Anfrage (userID?) 12 Mal aufzurufen, können Sie BenutzerID einer Variablen oben auf der ASP -Seite zuweisen. Verwenden Sie dann diese Variable auf der gesamten Seite. Dies spart 11 COM -Methodenaufrufe.
In der Tat ist der Zugriff auf COM -Eigenschaften oder -Methoden nicht so teuer. Hier ist ein Beispiel für einen ziemlich gemeinsamen Code (syntaktisch):
foo.bar.blah.baz = foo.bar.blah.qaz (1)
Wenn foo.bar.blah.zaq = foo.bar.blah.abc dann '...
Wenn dieser Code ausgeführt wird, passiert Folgendes:
Die variable Foo wird in ein globales Objekt gelöst.
Die variable Balken wird als Mitglied von Foo gelöst. Dies ist eigentlich ein COM -Methodenaufruf.
Die Variable Bla wird als Mitglied von Foo.bar gelöst. Dies ist ein weiterer COM -Methodenaufruf.
Die variable Qaz wird als Mitglied von Foo.bar.blah gelöst. Das ist richtig, dies ist immer noch ein COM -Methodenaufruf.
Rufen Sie Foo.bar.blah.quaz (1) an. Ein weiterer COM -Methode -Anruf. Habe es?
Führen Sie die Schritte 1 bis 3 erneut aus, um Baz zu analysieren. Das System weiß nicht, ob das Aufrufen von Qaz das Objektmodell ändert, sodass die Schritte 1 bis 3 erneut durchgeführt werden müssen, um BAZ zu beheben.
Resolve Baz als Mitglied von Foo.bar.blah. Attribute zuweisen.
Führen Sie die Schritte 1 bis 3 erneut aus, um Zaq zu analysieren.
Führen Sie die Schritte 1 bis 3 erneut aus, um ABC zu analysieren.
Wie Sie sehen können, ist die Effizienz ziemlich schlecht (und langsam). Ein kurzer Weg, um diesen Code in VBScript zu schreiben, ist:
Setzen
Myobj.baz = myobj.qaz (1)
Wenn myobj.zaq = myobj.abc dann '...
Wenn Sie VBScript 5.0 oder höher verwenden, können Sie diesen Code mit der With -Anweisung schreiben:
mit foo.bar.blah
.baz = .qaz (1)
If .zaq = .ABC dann '...
...
Beachten Sie
, dass diese Technik auch für die VB -Programmierung gilt.
Tipp 13: Vermeiden Sie die erneuten Dimensionierung von Arrays
von REM-Arrays sollten nach Möglichkeit vermieden werden. In Bezug auf die Leistung ist es besser, die anfängliche Dimensionalität des Arrays auf sein Worst-Case-Szenario festzulegen oder die Dimensionen auf sein Best-Case-Szenario festzulegen und es dann neu zu dimensionieren nach Bedarf. Dies bedeutet nicht, nur ein paar Megabyte Erinnerung zuzuweisen, wenn Sie wissen, dass Sie es nicht brauchen.
Der folgende Code zeigt Ihnen die unangemessene Verwendung von Dim und REDIM.
<%
Dimmyarray ()
Redimmyarray (2)
Myarray (0) =? Hallo?
Myarray (1) =? Auf Wiedersehen?
MyArray (2) =? Abschied?
...
'Ein anderer Code, in dem Sie am Ende mehr Platz benötigen, passiert dann ...
Reduzieren myarray (5)
Myarray (3) =? Mehr Sachen?
Myarray (4) = noch mehr Dinge?
Myarray (5) = noch mehr Dinge?
%>
Es ist viel besser, die anfängliche Größe des Arrays von Anfang an (in diesem Fall 5) richtig zu beeindrucken, als das Array zu reduzieren, um es größer zu machen. Sie können einen Speicher verschwenden (wenn Sie nicht alle Elemente verwenden), aber der Vorteil ist, dass es schneller wird.
Tipp 14: Verwenden Sie eine Antwortpufferung
Sie können eine gesamte Ausgangsseite pufferen, indem Sie "Antwortpufferung" aktivieren. Dies minimiert das Schreiben an den Browser und verbessert die Gesamtleistung. Jeder Schreibvorgang verursacht einen erheblichen Overhead (sowohl in IIS als auch in Bezug auf die Menge der Daten, die über das Netzwerk gesendet werden), desto weniger schreiben desto besser. Aufgrund seines langsamen Starts und der Verwendung des Nagling-Algorithmus (zum Linderung der Netzwerkstauung) ist TCP/IP beim Senden einiger großer Datenbrocken viel effizienter, als wenn es viele kleine Brocken senden muss.
Es gibt zwei Möglichkeiten, um die Antwortpufferung zu ermöglichen. Zunächst können Sie den Internet Services Manager nutzen, um die Antwortpufferung für die gesamte Anwendung zu aktivieren. Wir empfehlen diesen Ansatz und können standardmäßig die Antwortpufferung für neue ASP -Anwendungen in IIS 4.0 und IIS 5.0 ermöglichen. Zweitens können Sie die Antwortpufferung aktivieren, indem Sie die folgende Codezeile in der oben auf jeder ASP -Seite hinzufügen:
< % Antwort.Buffer = True %>
Diese Codezeile muss ausgeführt werden, bevor die Antwortdaten in den Browser geschrieben werden (dh, bevor ein HTML im ASP -Skript angezeigt wird und bevor Cookies mithilfe der Sammlung von Response.cookies festgelegt werden). Im Allgemeinen ist es am besten, die Antwortpufferung für die gesamte Anwendung zu aktivieren. Auf diese Weise müssen Sie nicht die obige Codezeile oben auf jeder Seite schreiben.
Response.Flush
Eine häufige Beschwerde über die Antwortpufferung ist, dass Benutzer ASP -Seiten als nur langsam reagieren (auch wenn die Reaktionszeit insgesamt verbessert wird), da sie warten müssen, bis die gesamte Seite generiert ist, bevor sie etwas sehen können. Für langjährige Seiten können Sie die Antwort festlegen. Buffer = False, um die Antwortpufferung zu deaktivieren. Eine bessere Strategie besteht jedoch darin, die Methode der Antwort zu verwenden. Diese Methode sendet alle HTML, die mit ASP an den Browser konvertiert wurden. Zum Beispiel kann ASP die ersten 100 Zeilen einer 1000-Reihen-Tabelle konvertiert, um die Reaktion aufzurufen, um die Ergebnisse der Konvertierung in den Browser zu erzwingen, sodass der Benutzer die ersten 100 Zeilen sehen kann, bevor die verbleibenden Zeilen fertig sind. Diese Technik kombiniert die Reaktionspufferung perfekt mit dem Browser und zeigt allmählich Daten an.
(Beachten Sie, dass im obigen Beispiel für 1000-Reihen-Tabellen viele Browser erst mit der Anzeige der Tabelle angezeigt werden, wenn sie das Schließen </table> Tag sehen. Überprüfen Sie, ob Ihr Zielbrowser sie unterstützt. Um diese zu vermeiden, teilen Sie die Tabelle mit mehreren Tabellen mit mehreren Tabellen auf Weniger Zeilen und Aufrufe Antwort nach jeder Tabelle. Die Inhaltsbreite jeder Zelle.)
Eine weitere häufige Beschwerde über die Antwortpufferung besteht darin, dass sie viel Serverspeicher einnimmt, wenn sehr große Seiten erzeugt werden. Unabhängig von der Methode zur Erzeugung großer Seiten kann dieses Problem auch durch die clevere Verwendung der Antwort gelöst werden.
Tipp 15: Batch -Embedded -Skripte und Antwort
. Wenn die Antwortpufferung nicht aktiviert ist, schreibt jede ausgeführte Anweisung Daten in vielen kleinen Paketen über das Netzwerk in den Browser. Das ist sehr langsam. Darüber hinaus führt die durchsetzte Ausführung einer kleinen Menge von Skripten und HTML zu einem Umschalten zwischen der Skript -Engine und HTML, wodurch die Leistung verringert wird. Verwenden Sie daher den folgenden Trick: Verwenden Sie die Antwort. Schreiben Sie Aufrufe anstelle von eng gebündelten Inline -Ausdrücken. Zum Beispiel gibt es im folgenden Beispiel einen Schreibschreiber in den Antwortstrom pro Feld pro Zeile, und es gibt viele Schalter zwischen VBScript und HTML pro Zeile:
<tabelle>
< % Für jede FLD in Rs.Fields %>
<Th> < % = fld.name %> </th>
<%
Nächste
Zwar nicht rs.eof
%>
<tr>
< % Für jede FLD in Rs.Fields %>
<td> < % = fld.Value %> </td>
<% Als nächstes
</tr>
<% Rs.Movenext
Wend %>
</table>
Der folgende Code ist effizienter, wobei einer in den Antwortstrom pro Zeile schreibt. Der gesamte Code ist in einem VBScript -Block enthalten:
<tabelle>
<%
Für jede FLD in Rs.Fields
Response.write (? <th>? & Fld.name &? </Th>? & Vbcrlf)
Nächste
Zwar nicht rs.eof
Response.write (? <tr>?)
Für jede FLD in Rs.Fields %>
Response.write (? <td>? & Fld.value &? </Td>? & Vbcrlf)
Nächste
Response.write? </Tr>?
Wend
%>
</table>
Dieser Trick funktioniert besonders gut, wenn die Antwortpufferung deaktiviert ist. Es ist eine gute Idee, die Reaktionspufferung zu aktivieren und zu prüfen, ob die Reaktion der Batching.Write zur Verbesserung der Leistung hilft.
,
die den Körper der Tabelle baut (während nicht Rs.Eof ...), durch einen sorgfältig konstruierten GetString -Anruf ersetzt werden.
Tun Sie, wenn Benutzer vor der Verwendung der Antwort ungeduldig sind
. Wenn sie auf Aktualisieren klicken oder auf eine andere Seite auf dem Server wechseln, wird am Ende der ASP -Anforderungswarteschlange eine neue Anfrage und eine getrennte Anforderung in der Mitte der Warteschlange gewartet. Dies geschieht häufig, wenn die Last auf dem Server hoch ist (und daher die Anfrage -Warteschlange lang und die Antwortzeiten entsprechend lang), was die Situation nur verschlimmern. Es macht keinen Sinn, ASP -Seiten (insbesondere langsame, große ASP -Seiten) auszuführen, wenn der Benutzer nicht mehr verbunden ist. Sie können dies mit der Antwort der Antwort überprüfen. Wenn es falsch zurückgibt, sollte die Antwort aufgerufen werden und der Rest der Seite sollte verworfen werden. Tatsächlich hat IIS 5.0 dieses Verhalten programmiert - jedes Mal, wenn ASP eine neue Anfrage ausführen wird, überprüft es, wie lange die Anfrage in der Warteschlange gewartet hat. Wenn es dort länger als 3 Sekunden gewartet hat, prüft ASP, ob der Client noch verbunden ist, und falls nicht die Anfrage sofort kündigen. Sie können die Zeitüberschreitung von 3 Sekunden an einen anderen Wert anhand der ASPQUEUeConnectionTestTime -Einstellung in der Metabase einstellen.
Sie können die Antwort auch überprüfen. Wenn die Antwortpufferung der Reaktion aktiviert ist, ist es eine gute Idee, die Antwort durchzuführen. Flush von Zeit zu Zeit, um den Benutzer mitzuteilen, was passiert.
Beachten Sie, dass auf IIS 4.0 die Antwort. Wenn die Pufferung aktiviert ist, müssen Sie auch Antwort durchführen. Auf IIS 5.0 müssen dies nicht tun - ISCLIENTCONNECTED funktioniert einwandfrei. In jedem Fall hat die Antwort. IsclientConnected hat einen Überkopf. Nur wenn eine Operation mindestens (z. B.) 500 Millisekunden dauert (eine lange Zeit, wenn Sie einen Durchsatz von Zehnseiten pro Sekunde beibehalten möchten), verwenden Sie es einfach. Die Erfahrung zeigt, dass Sie es nicht jedes Mal aufrufen sollten, wenn eine enge Schleife wiederholt ausgeführt wird, z.
Tipp 17: Verwenden Sie das <elofthob> -Tag für instanziierte Objekte,
wenn Sie auf ein Objekt verweisen möchten, das nicht in allen Codepfaden verwendet wird (insbesondere server- oder anwendungsübergreifende Objekte). Verwenden Sie die <-Objekt-Runat = Server-ID = Objname> Tag Deklaration in global.asa sie anstatt die Server zu verwenden.CreateObject -Methode. Server.createObject erstellt Objekte sofort. Wenn Sie das Objekt in Zukunft nicht verwenden, haben Sie Ressourcen verschwendet. Die <Objekt -ID = Objname> Tag erklärt Objname, aber Objname wird erst dann erstellt, wenn seine Methode oder Eigenschaft zum ersten Mal verwendet wird.
Dies ist ein weiteres Beispiel für die faule Bewertung.
Tipp 18: Verwenden Sie Typelib -Deklarationen für ADO und andere Komponenten.
Wenn Sie ADO verwenden, fügen Entwickler häufig adovbs.txt hinzu, um auf verschiedene ADO -Konstanten zuzugreifen. Diese Datei muss auf jeder Seite enthalten sein, auf der Konstanten verwendet werden sollen. Diese konstante Datei ist ziemlich groß und fügt der Kompilierungszeit und der Skriptgröße jeder ASP -Seite viel Overhead hinzu.
IIS 5.0 führte die Fähigkeit ein, an Bibliotheken vom Typ Komponenten zu binden. Auf diese Weise können Sie die Typ -Bibliothek einmal verweisen und auf jeder ASP -Seite verwenden. Für jede Seite gibt es keinen Overhead von Kompilien von konstanten Dateien, und Komponentenentwickler müssen keine VBScript#_include -Dateien für die Verwendung auf ASP erstellen.
Um auf Ado Typelib zuzugreifen, geben Sie die folgende Erklärung in global.asa.
<!- metadata name =? Microsoft activex data Objects 2.5 Bibliothek?
Typ =? Typelib?
oder
<!- Metadaten Typ =? Typelib?
Programme
Common Dateien System ado msado15.dll
? Dienstleistungen bieten Unterstützung. Verwenden Sie diese Funktionen, wann immer möglich. Alle diese Technologien führen eine clientseitige Validierung und das Datenausschnitt durch und beseitigen die Notwendigkeit einer Roundreise zum Webserver. Wenn Sie einen intelligenten Browser ausführen, kann der Browser eine Validierung für Sie durchführen (z. B. überprüft, ob eine Kreditkartenprüfungsumme gültig ist, bevor Sie einen Beitrag ausführen). Verwenden Sie diese Funktion, wenn möglich. Durch die Reduzierung von Client-Server-Roundtrips reduzieren Sie die Last auf dem Webserver und reduzieren den Netzwerkverkehr (obwohl die erste an den Browser gesendete Seite möglicherweise größer ist) und alle vom Server aufgerufenen Back-End-Ressourcen. Darüber hinaus muss der Benutzer keine neue Seite wie gewohnt lesen, damit der Benutzer besser ist. Dies bedeutet nicht, dass Sie die serverseitige Validierung überspringen können. Sie sollten auch immer die serverseitige Validierung durchführen. Dies verhindert, dass der Client aus irgendeinem Grund falsche Daten generiert (z. B. ein Hacker oder der Browser, der keine clientseitigen Validierungsroutinen ausführt).
Es ist viel Arbeit in die Entwicklung von "Browser-unabhängigen" HTML-HTML. Aufgrund dieser Sorge zögern Entwickler, beliebte Browserfunktionen zu verwenden, die die Leistung verbessern könnten. Für einige wirklich leistungsstarke Websites muss Browser-Zugriffsprobleme besorgt sein, und eine gute Strategie besteht darin, die Seite zu optimieren, um sie an beliebte Browser anzupassen. Browserfunktionen können in ASP mithilfe der Browser -Funktionskomponente leicht erkannt werden. Tools wie Microsoft FrontPage helfen für den Browser und eine spezifische Version von HTML. Sehen Sie, wann besser schlimmer ist? Abwägung der Technologie-Kompromisse für weitere Diskussionen.
Tipp 20: Vermeiden Sie die String -Verkettung in einer Schleife.
Viele Personen erstellen eine Zeichenfolge in einer Schleife wie folgt:
s =? <tabelle>?
Für jede FLD in Rs.Fields
S = S &? <Th>?
nächstes
, aber nicht rs.eof
S = S & VBCRLF &?
Für jede FLD in Rs.Fields
s = s &? <td>?
Nächste
S = S &?
rs.MoveNext
Wend
S = S & VBCRLF &? </Table>?
Antwort.Write s
Bei diesem Ansatz treten einige Probleme auf. Das erste Problem ist, dass die Verkettung von Saiten wiederholt bis zur Leistung von zwei Zeiten dauert. Ein einfacheres Beispiel veranschaulicht dieses Problem deutlicher.
s = ??
Für i = ASC (? A?) Zu ASC (? Z?)
s = s & chr (i)
Nächste
In der ersten Iteration erhalten Sie eine Ein-Charakter-Zeichenfolge? A?. In der zweiten Iteration muss VBScript die Zeichenfolge neu zuweisen und zwei Zeichen (? Ab?) In s kopieren. Bei der dritten Iteration muss es auch erneut zuverweichen und drei Zeichen in s kopieren. Auf n (26.) Iterationen muss es n Charaktere neu zuweisen und kopieren. Die Gesamtsumme beträgt 1+2+3+...+n, dh n*(n+1)/2 Kopien.
Im obigen Datensatz Beispiel wird bei 100 Datensätzen und 5 Feldern die innere Schleife 100*5 = 500 Mal ausgeführt, und die Zeit, die für alle Kopien und Neuzuweisung aufgewendet wird, beträgt proportional zu 500*500 = 250.000. Dies sind zu viele Kopiervorgänge für ein mäßig großes Datensatz.
In diesem Fall könnte der Code durch die Verwendung von Response.write () oder Inline -Skripten (< % = fld.Value %>) anstelle einer String -Verkettung verbessert werden. Wenn die Antwortpufferung aktiviert ist (es sollte sollte), ist dies schneller, da die Antwort die Daten nur an das Ende des Antwortpuffer anfährt. Es ist keine Neuzuweisung beteiligt, daher ist es sehr effizient.
Im speziellen Fall der Konvertierung eines ADO -Datensatzes in eine HTML -Tabelle sollten Sie in Betracht ziehen, GetRows oder GetString zu verwenden.
Wenn Sie Strings in Jscript verkettet, wird besonders empfohlen, den += Operator zu verwenden, dh s +=? Eine Zeichenfolge?
Tipp 21: Aktivieren Siestandardmäßig
Browser und Proxy -Caching
, ASP deaktiviert das Caching in Browsern und Proxys.Dies ist sinnvoll, da ASP -Seiten von Natur aus dynamisch mit zugrunde liegenden Informationen sind, die sich im Laufe der Zeit ändert. Wenn für die Seite keine Aktualisierung in jeder Ansicht erforderlich ist, sollten Sie Browser und Proxy -Caching aktivieren. Auf diese Weise können Browser und Proxys eine "zwischengespeicherte" Kopie der Seite für eine bestimmte Zeitspanne verwenden, deren Länge Sie steuern können. Durch das Caching kann die Last auf dem Server erheblich reduziert und die Wartezeit des Benutzers verkürzt werden.
Welche dynamische Seite kann als Seite zum zwischengespeicherten Seiten verwendet werden? Hier sind einige Beispiele:
Wettervorhersageseite auf dieser Seite wird die Wettervorhersage alle 5 Minuten aktualisiert.
Homepage -Auflistung von Nachrichten oder Veröffentlichungen, die zweimal täglich aktualisiert werden.
Eine Liste der Investmentfondsleistung, bei der alle paar Stunden grundlegende Statistiken aktualisiert werden.
Beachten Sie, dass beim Einsatz von Browser- oder Proxy -Caching die Anzahl der auf dem Webserver angemeldeten Besuche reduziert wird. Wenn Sie alle Seitenansichten oder Beiträge genau messen möchten, möchten Sie keinen Browser- und Proxy -Caching verwenden.
Das Browser -Caching wird vom HTTP -Ablauf -Header gesteuert, der vom Webserver an den Browser gesendet wird. ASP bietet zwei einfache Mechanismen für das Senden dieses Headers. Um die Anzahl der Minuten festzulegen, nach denen eine Seite abläuft, setzen Sie die EXPIRES -Eigenschaft der Antwort. Das folgende Beispiel gibt dem Browser mit, dass der Inhalt in 10 Minuten abläuft:
< % Antwort.expires = 10 %>
Reaktion einstellen.expires auf eine negative Zahl oder 0 deaktiviert das Caching. Verwenden Sie unbedingt eine große negative Anzahl, z. B. -1000 (etwas mehr als einen Tag), um eine Missverhältnis zwischen Server- und Browseruhren zu vermeiden. Mit der zweiten Eigenschaft, Response.expiresabSolute, können Sie die spezifische Zeit festlegen, zu der der Inhalt abläuft:
< % response
Anstatt das Antwortobjekt zu verwenden, um die Ablaufzeit festzulegen, können Sie das <Meta> -Tag in das HTML schreiben, normalerweise im Abschnitt <Head> in der HTML -Datei. Einige Browser werden diese Richtlinie respektieren, während Stellvertreter dies nicht tun.
<Meta http-äquiv =?
Schließlich können Sie die Eigenschaft response.cacheControl verwenden, um anzugeben, ob der Inhalt von einem HTTP -Proxy zwischengespeichert werden kann. Durch das Festlegen dieser Eigenschaft in "öffentlich" kann der Proxy diesen Inhalt zwischenspeichern.
< % Antwort.CACHECONTROL =?
Standardmäßig ist diese Eigenschaft auf "privat" eingestellt. Beachten Sie, dass das Proxy -Caching für Seiten, auf denen Daten spezifisch für einen Benutzer angezeigt werden, nicht aktiviert werden sollte, da der Proxy den Benutzerseiten, die anderen Benutzern gehören, bedienen kann.
Tipp 22: Verwenden Sie Server
. Diese Funktion wird üblicherweise verwendet, um den Benutzer auf eine Anmelde- oder Fehlerseite umzuleiten. Da die Weiterleitung eine Anfrage nach einer neuen Seite erzwingt, muss der Browser zwei Rundefahrten zum Webserver machen und der Webserver eine weitere Anfrage bearbeiten. IIS 5.0 führt einen neuen Funktionserver vor. Transfer, der die Ausführung auf eine andere ASP -Seite auf demselben Server überträgt. Dies vermeidet redundante Roundtrips Browser-Web-Server, wodurch die Leistung des Gesamtsystems und die Reaktionszeit der Benutzer verbessert wird. Überprüfen Sie die "neue Richtung" in "Redirect", es sollte server.transfer und server.execute sein.
In IIS 5.0 nutzen auch eine vollständige Liste der neuen Funktionen in IIS 5.0 und ASP 3.0.
Tipp 23: Verwenden Sie einen Backslash in Verzeichnis -URLs.
Ein zugehöriger Tipp ist, um sicherzustellen, dass Sie einen Backslash (/) in URLs verwenden, die auf Verzeichnisse hinweisen. Wenn Sie den nachverfolgenden Schrägstrich weglassen, wird der Browser an den Server eine Anfrage stellt, nur um dem Server mitzuteilen, dass er ein Verzeichnis anfordert. Der Browser stellt eine zweite Anfrage durch, wobei ein Schrägstrich an die URL angebracht wird. Erst dann kann der Server mit dem Standarddokument oder der Verzeichnisauflistung des Verzeichnisses reagieren (wenn kein Standarddokument und Verzeichnis -Browsen aktiviert sind). Das Anhängen des Schrägs beseitigt die erste, nutzlose Rückkehr. Um es den Benutzern zu erleichtern, das Lesen zu erleichtern, kann der nachverfolgende Schrägstrich im Anzeigenamen weggelassen werden.
Schreiben Sie beispielsweise:
<a href =? Http: //msdn.microsoft.com/workshop/? Title =? Msdn web
Workshop?> Http://msdn.microsoft.com/workshop </a>
Dies gilt auch für URLs, die auf die Startseite auf einer Website hinweisen: Verwenden Sie Folgendes: <a href =? com?>.
Tipp 24: Vermeiden Sie die Verwendung von Servervariablen
. Die Situation ähnelt der Suche nach einer Datei in einem Ordner auf einem muffigen Dachboden. Wenn Sie dieses Dokument finden möchten, müssen Sie auf den Dachboden gehen, den Ordner finden und dann das Dokument finden. Das Gleiche passiert, wenn Sie eine Servervariable anfordern - wenn Sie zum ersten Mal eine Servervariable anfordern, leidet die Leistung. Nachfolgende Anforderungen an andere Servervariablen haben keinen Einfluss auf die Leistung.
Greifen Sie niemals auf ein nicht qualifiziertes Anforderungsobjekt zu (z. B. Anfrage ("Daten")). Request.Servervariables wird implizit für Elemente aufgerufen, die nicht in Anfrage sind. Die Anfrage.Servervariables Sammlung ist viel langsamer als andere Sammlungen.
Tipp 25: Das Upgrade auf die neuesten und größten
Systemkomponenten ist konstant, und wir empfehlen Ihnen, sie auf die neuesten und größten Konfigurationen zu verbessern. Es ist am besten, auf Windows 2000 zu aktualisieren (und damit IIS 5.0, ADO 2.5, MSXML 2.5, Internet Explorer 5.0, VBScript 5.1 und JScript 5.1). Auf Multiprozessor -Computern kann die Implementierung von IIS 5.0 und ADO 2.5 die Leistung erheblich verbessern. Unter Windows 2000 skaliert ASP ASP gut zu vier Prozessoren, während ASP unter IIS 4.0 nicht über zwei Prozessoren hinausgeht. Je mehr Scripting -Code und ADO in Ihrer Anwendung verwenden, desto mehr Leistungsverbesserungen werden Sie nach dem Upgrade auf Windows 2000 erleben.
Wenn Sie noch nicht auf Windows 2000 upgraden können, können Sie auf die neuesten Versionen von SQL Server, ADO, VBScript und JScript, MSXML, Internet Explorer und NT 4 -Service -Packs aktualisieren. Beide verbessern die Leistung und Zuverlässigkeit.
Tipp 26: Optimieren Sie den Webserver
Es gibt verschiedene IIS -Optimierungsparameter, die die Leistung der Site verbessern können. Zum Beispiel stellen wir bei IIS 4.0 häufig fest, dass eine Erhöhung des ASP ProcessOrtheadmax-Parameters (siehe IIS-Dokumentation) die Leistung erheblich verbessern kann, insbesondere auf Websites, die tendenziell auf Back-End-Ressourcen (wie Datenbanken) oder andere Zwischenprodukte (solches warten als Bildschirmpinsel). In IIS 5.0 können Sie feststellen, dass das Aktivieren von ASP -Thread -Gating effizienter ist, als eine optimale Einstellung für Aspprocessortheadmax zu finden, was inzwischen bekannt ist.
Eine gute Referenz finden Sie unter optimieren IIS unten.
Die optimalen Konfigurationseinstellungen hängen unter anderem von dem Anwendungscode, der Systemhardware ab, auf der sie ausgeführt wird, und der Client -Workload. Die einzige Möglichkeit, die besten Einstellungen zu finden, besteht darin, Leistungstests durchzuführen, die wir im nächsten Tipp besprechen werden.
Tipp 27: Durchführen von Leistungstests
Wie bereits erwähnt, ist die Leistung ein Merkmal. Wenn Sie die Leistung Ihrer Website verbessern möchten, legen Sie ein Leistungsziel fest und verbessern Sie sich schrittweise, bis Sie es erreicht haben. Nein, es werden keine Leistungstests durchgeführt. Am Ende des Projekts ist es oft zu spät, um die erforderlichen strukturellen Änderungen vorzunehmen, und Ihr Kunde wird enttäuscht sein. Führen Sie Leistungstests im Rahmen Ihrer Testroutine durch. Sie können Leistungstests für einzelne Komponenten einzeln durchführen, z. B. ASP -Seiten oder COM -Objekte oder auf der gesamten Website.
Viele Personen verwenden einen einzelnen Browser, um eine Seite zu fordern, um die Leistung einer Website zu testen. Dies gibt Ihnen das Gefühl, dass Ihre Website reagiert, aber sie wird Ihnen nicht sagen, wie Ihre Website unter Last funktioniert.
Um die Leistung genau zu testen, benötigen Sie in der Regel eine dedizierte Testumgebung. Diese Umgebung sollte Hardware enthalten, die der Produktionsumgebung hinsichtlich der Prozessorgeschwindigkeit, der Anzahl der Prozessoren, Speicher, Festplatten, Netzwerkkonfiguration usw. ähnlich ist. Zweitens müssen Sie die Workload des Kunden angeben: Wie viele gleichzeitige Benutzer gibt es, wie oft er Anfragen, auf welche Arten von Seiten sie klicken usw. Wenn Sie keine Daten zur tatsächlichen Nutzung von Site haben, müssen Sie die Nutzung schätzen. Schließlich benötigen Sie ein Tool, mit dem die erwarteten Client -Workloads simulieren können. Mit diesen Tools können Sie Fragen beantworten wie "Wenn ich n gleichzeitige Benutzer habe, wie viele Server benötige ich?" Sie können auch die Ursachen von Engpässen identifizieren und gegen sie optimieren.
Nachfolgend sind einige gute Tools für Webladetests aufgeführt. Insbesondere empfehlen wir das Microsoft Web Application Stress (WOS) Toolkit. Ermöglicht es Ihnen, Testskripte aufzuzeichnen und dann Hunderte oder Tausende von Benutzern zu simulieren, die auf einen Webserver zugreifen. War eine Reihe von Statistiken, einschließlich Anfragen pro Sekunde, Verteilung der Antwortzeit und Fehlerzahlen. IS ist sowohl in einer reichhaltigen Client-Schnittstelle als auch in einer webbasierten Schnittstelle verfügbar, mit der Sie Remote-Tests durchführen können.
Lesen Sie unbedingt den IIS 5.0 -Tuning -Handbuch.
Tipp 28: Lesen Sie die Ressourcenlinks
unten finden Sie Links zu einigen großartigen leistungsbezogenen Ressourcen. Wenn Sie mehr darüber erfahren möchten, lesen Sie die Entwicklung skalierbarer Webanwendungen.
Ressourcenoptimierung ASP -Skripte,
die
skalierbare
Webanwendungen
entwickeln
.
,Geschwindigkeits- und Optimierungsressourcen
von Nancy Winnick Cluts
,optimieren IIS
durch Charles CarrollDie Kunst und Wissenschaft des Webservers mit Internet Information Services 5.0
Nutzung von ASP in IIS 5.0,
Tuning IIS 4.0 für Hochvolumen -Websites von JD Meier, Tuning -Internetinformationen Serverleistung von Michael Stephenson
,der das Labyrinth der Einstellungen für die Optimierung der Webserverleistung
durch Mike Moore
navigiert undInternet Information Server 4.0 für die Leistung durch Todd Wanke,
ADO und SQL Server
von Hans HugliTop Ten Tipps verwaltet: Zugriff auf SQL über ADO
und ASP, Verbesserung, Verbesserung, Verbesserung, Verbesserung,Verbesserung Die Leistung Ihrer MDAC -Anwendung durch
JD Meier
,die in den Microsoft -Datenzugriffskomponenten von Suresh Kannan,
SQL Server: Leistungsbenchmarks und -anleitungen von
Leland Ahlbeck und Don Willits, die die Leistung von Datenzugriffskomponenten mit IIS 4.0,
Microsoft Data Access -Komponenten verbessern (DON -WILLITS (DON) (MICROSOFT -Datenzugriffskomponenten () (
Leistungsbenchmarks) zusammenhabenMDAC) und ActiveX Data Objects (ADO) Performance Tipps von Leland Ahlbeck,
Microsoft
SQL Server 7.0 Praktische Leistungsstimmung und Optimierung - Die Serverperspektive von Leland Ahlbeck,
Microsoft SQL Server 7.0 Praktische Leistungsstimmung und Optimierung - Die Serverperspektive von Damien Lindauer - The the Anwendungsperspektive von Damien Lindauer
Zugriff auf Aufzeichnungen über das Internet von Dino Esposito
ASP
-Komponenten -Richtlinien von JD Meier
Q243548: Info: Entwurfsrichtlinien für VB -Komponenten unter
ASP -Threading -Modellen,die von Nancy Winnick Cluts
so glücklich sind
? Aktive Serverkomponenten mit ATL von
Nancy Winnick Cluts
, Agility in Server-Komponenten von George Reilly,Erstellung leistungsstarker mittlerer Komponenten mit C ++ von
Neil Allain
,aktive Serverseiten und Com von Jon Flanders Apartments, von Don Box,
House of Com: Active Serverseiten von Don Box,
House of Com: Kontexte, von Don Box,
House of Com: Performance-Kompromisse der Windows 2000-Komponentenausführungsumgebung, von Don Box,
Erstellen von COM-Komponenten, die visuelle Basic und Skripten voll ausnutzen von IVO Salmre
-Komponenten-Design-Prinzipien für MTS-
Wörterbuchkomponenten
Erstellen
eines
Seiten
-
Cache
Q175167: HowTO: Persisting Werte ohne Sitzungen
Q157906: Howto: Wie man den Zustand über Seiten mit VBScript-XML-basierten Persistenzverhalten aufrechterhält,
fixe Webfarmkopfschmerzen von Aaron Skonnard
House of Com: Statuslose Programmierung durch Don-Box
-Leistung und Skalierbarkeit
Bluprint für den Aufbau von Web-Web-Web-Gebäuden zum Aufbau von Web-Web-Gebäuden zum Aufbau von Web-Webs Websites, die die Microsoft Windows DNA Platform
Server Performance und Skalierbarkeit Killers von George Reilly
Microsoft Visual Studio Skalierbarkeit Center
Fitch & Mather Stocks 2000
Tuning The FMStocks Application
High-Performance Visual Basic Apps, von Ken Spencer
Duwamish Books, Phase 4
Top Windows DNA-Performance-Fehler, verwenden und wie man sie durch Gary Geiger und Jon Pulsipher-
Gebäude von statischer HTML zu Hochleistungs-Webfarmen von Shawn Bice
Microsoft
-Webanwendungs-Stress-Tool
verhindernIch
kann nicht genug belasten.
Performance Kit-
Überwachungsereignisse in verteilten Anwendungen mit Visual Studio Analyzer von Mai-Lan Tomsen
Bibliography
Professional Active Serverseiten 3.0, Wrox Press (insbesondere Kapitel 26: Optimierung der ASP-Leistung, George Reilly mit Matthew Gibbs).
Microsoft Internet Information Services 5.0 Ressourcenhandbuch (mit Windows 2000 Server Resource Kit), Microsoft Press.
Microsoft Internet Information Server Resource Kit (für IIS 4.0), Microsoft Press.
Programmieren verteilte Anwendungen mit COM und Microsoft Visual Basic 6.0 von Ted Pattison, Microsoft Press.
Effektiv com, von Don Box, Keith Brown, Tim Ewald und Chris verkaufen;
Entwicklung von Web -Usability: Die Praxis der Einfachheit von Jakob Nielsen, neue Fahrer.
ASP Webseitenmicrosoft
TechNet für IIS
Learnasp.com
4guysfromrolla.com
15seconds.com
ASPTODAY.com
ASP101.com
ASPLISTS.com. Viele professionelle Mailinglisten umfassen:
Schneller Code!
ASP fortgeschritten
Nicht Neulingsmanagement
Skalierbarkeit
Visuelle grundlegende Komponenten
Xml
C ++/ATL -Komponentengebäude
Useit.com: Web Usability
ASP Style
ASP Best Practices von George Reilly
ASP Schnelle Lektionen von Charles Carroll
Planung für ASP John Meade
ASP RichtlinienXML
von JD Meier
Inside XML Performance von Chris Lovett
Inside MSXML3 Performance von Chris Lovett