Verbessern der Leistung mit Objektpooling
Objektpooling kann unter bestimmten Umständen äußerst effektiv sein und zu erheblichen Leistungssteigerungen führen. Die allgemeine Idee für die Wiederverwendung von Objekten zum besten Vorteil besteht darin, so viele Ressourcen wie möglich zu bündeln, die Initialisierung aus der tatsächlich ausgeführten Arbeit zu berücksichtigen und dann die Pooleigenschaften zur Bereitstellungszeit administrativ an die tatsächliche Hardware anzupassen. Das heißt, Sie sollten die folgenden Schritte ausführen:
- Schreiben Sie das Objekt, um die teure Initialisierung und Ressourcenbeschaffung zu berücksichtigen, die für einen beliebigen Client als Voraussetzung für die tatsächliche Arbeit im Auftrag des Clients ausgeführt wird. Schreiben Sie schwere Objektkonstruktoren, um so viele Ressourcen wie möglich zu poolen, damit diese vom Objekt gehalten werden und sofort verfügbar sind, wenn Clients ein Objekt aus dem Pool abrufen.
- Konfigurieren Sie den Pool administrativ, um das beste Gleichgewicht der verfügbaren Hardwareressourcen zu erzielen, und handeln Sie in der Regel den Speicher, der für die Verwaltung eines Pools einer bestimmten Größe im Austausch für einen schnelleren Clientzugriff und die Verwendung von Objekten vorgesehen ist. Ab einem bestimmten Punkt führt das Pooling zu geringeren Renditen, und Sie können eine gute Leistung erzielen, während sie die mögliche Ressourcennutzung durch eine bestimmte Komponente einschränken.
Ausführen der tatsächlichen Arbeit oder Abrufen von Ressourcen
Wenn Sie über eine Komponente verfügen, die Clients kurz und in schneller Folge verwenden und bei der ein erheblicher Teil der Objektnutzungszeit mit dem Erwerb von Ressourcen oder der Initialisierung vor der Ausführung bestimmter Aufgaben für den Client verbracht wird, ist die Wahrscheinlichkeit groß, dass das Schreiben Ihrer Komponente für die Verwendung von Objektpooling ein großer Gewinn für Sie ist.
Sie können die Komponente so schreiben, dass Sie im Konstruktor des Objekts so viel zeitaufwendige Arbeit wie möglich ausführen, die für alle Clients einheitlich ist: Abrufen einer oder mehrerer Verbindungen, Ausführen von Skripts, Abrufen von Initialisierungsdaten aus Dateien oder über ein Netzwerk usw. Dies hat den Effekt, dass jede solche Ressource poolt. Sie bündeln die Kombination aus Ressourcen und generischem Zustand, die erforderlich sind, um einige Aufgaben auszuführen.
In diesem Fall haben Clients, wenn sie ein Objekt aus dem Pool erhalten, diese Ressourcen sofort verfügbar. In der Regel wird das -Objekt verwendet, um eine kleine Arbeitseinheit zu erledigen, Daten zu pushen oder zu pullen, und dann ruft das Objekt IObjectContext::SetComplete oder IObjectContext::SetAbort auf und gibt zurück. Bei solchen Schnellfeuernutzungsmustern bietet pooling hervorragende Leistungsvorteile. Sie können die Einfachheit des zustandslosen automatischen Transaktionsprogrammiermodells voll nutzen und dennoch eine Leistung erzielen, die mit herkömmlichen zustandsbehafteten Komponenten gleicht.
Wenn Clients jedoch jedes Mal, wenn sie es aufrufen, ein Objekt für eine lange Zeit verwenden, ist das Pooling weniger sinnvoll. Der Geschwindigkeitsvorteil, den Sie erzielen, ist geringfügig, da sich die Nutzungszeit im Verhältnis zur Initialisierungszeit erhöht. Sie erhalten abnehmende Rückgaben, die möglicherweise nicht die Kosten für den Arbeitsspeicher rechtfertigen, der für einen Pool mit aktiven Objekten erforderlich ist.
Kosten für mehrere Clients gemeinsam nutzen
Eine Abweichung bei der Faktorisierung der Initialisierung besteht darin, dass Sie das Pooling verwenden können, um die Kosten für den Erwerb teurer Ressourcen statistisch zu amortisieren. Wenn Sie den Kauf oder die Initialisierung einmal durchführen und das Objekt dann wiederverwenden, teilen Sie diese Kosten für alle Clients, die das Objekt während seiner Lebensdauer verwenden. Hohe Bauzeit fällt nur einmal pro Objekt an.
Vorabzuweisen von Objekten
Wenn Sie eine mindeste Poolgröße angeben, wird diese Mindestanzahl von Objekten erstellt und gruppiert, wenn die Anwendung gestartet wird. Dies ist für alle Clients bereit, die die Anwendung aufrufen.
Steuern der Ressourcennutzung mit der Poolverwaltung
Sie können die maximale Poolgröße verwenden, um sehr präzise zu steuern, wie Sie Ressourcen verwenden. Wenn Sie beispielsweise eine bestimmte Anzahl von Datenbankverbindungen lizenziert haben, können Sie jederzeit steuern, wie viele Verbindungen Sie geöffnet haben.
Wenn Sie Clientnutzungsmuster, Objektnutzungseigenschaften und physische Ressourcen wie Arbeitsspeicher und Verbindungen berücksichtigen, werden Sie wahrscheinlich einen optimalen Ausgleichspunkt finden, wenn Sie die Leistungsoptimierung durchführen. Das Poolen von Objekten führt nach einem bestimmten Punkt zu abnehmenden Rückgaben. Sie können bestimmen, welches Leistungsniveau Sie benötigen, und dies mit den dafür erforderlichen Ressourcen abwägen.
Um die Leistungsoptimierung beim Konfigurieren des Objektpools zu erleichtern, können Sie Objektstatistiken für die Komponenten in einer Anwendung überwachen. Ausführliche Informationen finden Sie unter Überwachungsobjektstatistik.
Verbessern der Leistung von JIT-Activated Komponenten
Objektpooling funktioniert sehr gut mit dem COM+-Just-in-Time-Aktivierungsdienst . Durch das Pooling von Objekten, die JIT-aktiviert werden, können Sie die Reaktivierung von Objekten beschleunigen. Sie profitieren von den Vorteilen, den Kanal durch die JIT-Aktivierung geöffnet zu halten und gleichzeitig die Kosten für die Reaktivierung zu verringern. In diesem Fall können Sie das Pooling verwenden, um zu steuern, wie viel Arbeitsspeicher Sie Objekten zuweisen möchten, für die Verweise aktiv sind.
Sie werden wahrscheinlich JIT-aktivierte Komponenten poolen, wenn sie transaktional sind. Objektpooling ist für die Verarbeitung von Transaktionskomponenten optimiert. Weitere Informationen finden Sie unter Pooling Transactional Objects.
Zugehörige Themen