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 Erneutverwendung von Objekten, um optimale Vorteile zu erzielen, besteht im Pool so viele Ressourcen wie möglich, das Ausnutzen der Initialisierung aus tatsächlich ausgeführter Arbeit und das anschließende administrative Anpassen der Poolmerkmale an die tatsächliche Hardware zum Zeitpunkt der Bereitstellung. Das heißt, Sie sollten mit den folgenden Schritten fortfahren:
- Schreiben Sie das -Objekt so, dass teure Initialisierung und Ressourcenerfassung, die für jeden Client ausgeführt wird, als Voraussetzung für die eigentliche Arbeit im Auftrag des Clients auswendig werden. Schreiben Sie große Objektkonstruktoren, um so viele Ressourcen wie möglich in einem Pool zu bündeln, damit diese vom Objekt gehalten werden und sofort verfügbar sind, wenn Clients ein Objekt aus dem Pool erhalten.
- Konfigurieren Sie den Pool administratorisch, um ein optimales Gleichgewicht in den verfügbaren Hardwareressourcen zu erzielen. In der Regel wird der Arbeitsspeicher für die Verwaltung eines Pools einer bestimmten Größe im Austausch für schnelleren Clientzugriff und die Verwendung von Objekten getauscht. Zu einem bestimmten Zeitpunkt erzielt das Pooling abnehmende Ergebnisse, und Sie können eine ausreichend gute Leistung erzielen und gleichzeitig die mögliche Ressourcennutzung durch eine bestimmte Komponente einschränken.
Tatsächlicher Arbeits- oder Ressourcenerwerb
Wenn Sie über eine Komponente verfügen, die Clients kurz und in schneller Folge verwenden, bei der ein großer Teil der Objektnutzungszeit für den Ressourcenerwerb oder die Initialisierung vor der spezifischen Arbeit für den Client verwendet wird, ist die Wahrscheinlichkeit groß, dass das Schreiben Ihrer Komponente zur Verwendung des Objektpoolings für Sie ein großer Gewinn ist.
Sie können die Komponente so schreiben, dass Sie im Konstruktor des Objekts so viel zeitaufwändige Arbeit wie möglich ausführen, die für alle Clients einheitlich ist– abrufen einer oder mehrere Verbindungen, Ausführen von Skripts, Abrufen von Initialisierungsdaten aus Dateien oder über ein Netzwerk usw. Dies wirkt sich auf das Pooling jeder dieser Ressourcen aus. Sie bündeln die Kombination aus Ressourcen und dem generischen Zustand, die zum Ausführen einiger Aufgaben erforderlich sind.
Wenn Clients in diesem Fall ein Objekt aus dem Pool erhalten, stehen ihnen diese Ressourcen sofort zur Verfügung. In der Regel verwenden sie das -Objekt, um eine kleine Arbeitseinheit auszuführen, daten zu pushen oder zu pullen, und dann wird das Objekt IObjectContext::SetComplete oder IObjectContext::SetAbort aufrufen und zurückgeben. Bei verwendungsschnellen Verwendungsmustern wie diesem bietet pooling hervorragende Leistungsvorteile. Sie können die Einfachheit des zustandslosen automatischen Transaktionsprogrammierungsmodells vollständig nutzen und dennoch eine Leistung erzielen, die mit herkömmlichen zustandsvollen Komponenten gleicht.
Wenn Clients jedoch bei jedem Aufruf ein Objekt über einen längeren Zeitraum verwenden, ist das Pooling weniger sinnvoll. Der Geschwindigkeitsvorteil, den Sie erzielen, ist geringfügig, da die Nutzungszeit relativ zur Initialisierungszeit zunimmt. Sie erhalten abnehmende Rückgaben, die die Kosten des Arbeitsspeichers, der zum Halten eines Pools aktiver Objekte erforderlich ist, möglicherweise nicht rechtfertigen.
Gemeinsame Nutzung von Kosten für mehrere Clients
Eine Variation bei der Factoring-Out-Initialisierung besteht in der Verwendung von Pooling, um die Kosten für den Erwerb teurer Ressourcen statistisch zu amortisieren. Wenn Sie den Treffer der Übernahme oder Initialisierung einmal nutzen und das Objekt dann wiederverwenden, teilen Sie diese Kosten für alle Clients, die das Objekt während seiner Lebensdauer verwenden. Eine hohe Konstruktionszeit ist nur einmal pro Objekt angefallen.
Vorabbelegung von Objekten
Wenn Sie eine mindeste Poolgröße ungleich 0 (null) angeben, wird diese Mindestanzahl von Objekten erstellt und beim Starten der Anwendung in einem Pool zusammengepoolt. Dies ist für alle Clients bereit, die die Anwendung aufrufen.
Steuerung der Ressourcennutzung mit Poolverwaltung
Sie können die maximale Poolgröße verwenden, um sehr genau zu steuern, wie Sie Ressourcen verwenden. Wenn Sie beispielsweise eine bestimmte Anzahl von Datenbankverbindungen lizenziert haben, können Sie steuern, wie viele Verbindungen Sie jederzeit geöffnet haben.
Wenn Sie Clientnutzungsmuster, Objektnutzungsmerkmale und physische Ressourcen wie Arbeitsspeicher und Verbindungen berücksichtigen, werden Sie bei der Leistungsoptimierung wahrscheinlich einen optimalen Balancepunkt finden. Das Pooling von Objekten führt nach einem bestimmten Punkt zu abnehmenden Rückgaben. Sie können bestimmen, welche Leistungsstufe Sie benötigen, und dies im Verhältnis zu den Ressourcen abgleichen, die erforderlich sind, um dies zu erreichen.
Um die Leistungsoptimierung beim Konfigurieren von Objektpooling zu vereinfachen, können Sie Objektstatistiken für die Komponenten in einer Anwendung überwachen. Weitere Informationen finden Sie unter Monitoring Object Statistics.
Verbessern der Leistung 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 JIT-Aktivierung geöffnet zu halten und gleichzeitig die Kosten für die Reaktivierung zu mindern. Sie können pooling in diesem Fall verwenden, um zu steuern, wie viel Arbeitsspeicher Sie Objekten zuordnen möchten, die über aktive Verweise verfügen.
Sie werden wahrscheinlich JIT-aktivierte Komponenten in einem Pool zusammen nutzen, wenn sie transaktional sind. Objektpooling ist für die Verarbeitung von Transaktionskomponenten optimiert. Weitere Informationen finden Sie unter Pooling Transactional Objects.