Amélioration des performances avec le regroupement d’objets

Le regroupement d’objets peut être extrêmement efficace dans certaines circonstances, ce qui entraîne des augmentations substantielles des performances. L’idée générale pour réutiliser au mieux les objets consiste à mettre en pool autant de ressources que possible, en factorisant l’initialisation à partir du travail effectué, puis à adapter administrativement les caractéristiques du pool au matériel réel au moment du déploiement. Autrement dit, vous devez procéder en suivant les étapes suivantes :

  1. Écrivez l’objet afin de prendre en compte l’initialisation coûteuse et l’acquisition de ressources effectuées pour n’importe quel client comme condition préalable à l’exécution du travail réel pour le compte du client. Écrivez des constructeurs d’objets lourds pour mettre en pool autant de ressources que possible afin qu’elles soient conservées par l’objet et immédiatement disponibles lorsque les clients obtiennent un objet du pool.
  2. Configurez administrativement le pool pour obtenir le meilleur équilibre entre les ressources matérielles disponibles, en échangeant généralement la mémoire dédiée à la maintenance d’un pool d’une certaine taille en échange d’un accès client et d’une utilisation plus rapide des objets. À un certain moment, le regroupement permet d’obtenir des rendements décroissants et vous pouvez obtenir suffisamment de performances tout en limitant l’utilisation possible des ressources par un composant particulier.

Effectuer un travail réel ou acquérir des ressources

Si vous avez un composant que les clients utiliseront brièvement et dans une succession rapide, où une partie importante du temps d’utilisation des objets est consacrée à l’acquisition de ressources ou à l’initialisation avant d’effectuer un travail spécifique pour le client, il est probable que l’écriture de votre composant pour utiliser le regroupement d’objets soit une grande victoire pour vous.

Vous pouvez écrire le composant afin que, dans le constructeur de l’objet, vous effectuez autant de travail fastidieux que possible pour tous les clients : acquisition d’une ou plusieurs connexions, exécution de scripts, extraction des données d’initialisation à partir de fichiers ou sur un réseau, etc. Cela a pour effet de regrouper chaque ressource de ce type. Vous combinez les ressources et l’état générique nécessaires pour effectuer un certain travail.

Dans ce cas, lorsque les clients obtiennent un objet à partir du pool, ces ressources sont immédiatement disponibles. En règle générale, ils utilisent l’objet pour effectuer une petite unité de travail, en push ou en extrayant des données, puis l’objet appelle IObjectContext::SetComplete ou IObjectContext::SetAbort et retourne. Avec des modèles d’utilisation rapide comme celui-ci, le regroupement génère d’excellents avantages en matière de performances. Vous pouvez tirer pleinement parti de la simplicité du modèle de programmation de transaction automatique sans état tout en offrant des performances identiques aux composants avec état traditionnels.

Toutefois, si les clients utilisent un objet pendant une longue période chaque fois qu’ils l’appellent, le regroupement aura moins de sens. L’avantage de vitesse que vous obtenez est marginal à mesure que le temps d’utilisation augmente par rapport au temps d’initialisation. Vous obtenez des retours décroissants qui peuvent ne pas justifier le coût de la mémoire nécessaire pour contenir un pool d’objets actifs.

Partage des coûts entre plusieurs clients

Une variante de l’initialisation de la factorisation est que vous pouvez utiliser le regroupement pour amortir statistiquement le coût d’acquisition de ressources coûteuses. Si vous prenez le succès de l’acquisition ou de l’initialisation une fois, puis réutilisez l’objet, vous partagez ce coût entre tous les clients qui utilisent l’objet pendant sa durée de vie. Le temps de construction lourd n’est encouru qu’une seule fois par objet.

Pré-allocation d’objets

Si vous spécifiez une taille de pool minimale différente de zéro, ce nombre minimal d’objets sera créé et mis en pool au démarrage de l’application, prêt pour tous les clients qui appellent l’application.

Gouvernance de l’utilisation des ressources avec la gestion des pools

Vous pouvez utiliser la taille maximale du pool pour régir très précisément l’utilisation des ressources. Par exemple, si vous avez concédé sous licence un certain nombre de connexions de base de données, vous pouvez contrôler le nombre de connexions que vous avez ouvertes à tout moment.

Lorsque vous prenez en compte les modèles d’utilisation du client, les caractéristiques d’utilisation des objets et les ressources physiques telles que la mémoire et les connexions, vous êtes susceptible de trouver un point d’équilibre optimal lorsque vous effectuez le réglage des performances. Le regroupement d’objets génère des retours décroissants après un certain point. Vous pouvez déterminer le niveau de performances dont vous avez besoin et l’équilibrer par rapport aux ressources nécessaires pour y parvenir.

Pour faciliter le réglage des performances lorsque vous configurez le regroupement d’objets, vous pouvez surveiller les statistiques d’objets pour les composants d’une application. Pour plus d’informations, consultez Statistiques d’objet de surveillance.

Améliorer les performances des composants JIT-Activated

Le regroupement d’objets fonctionne très bien avec le service d’activation juste-à-temps COM+ . En regroupant des objets qui sont activés par JIT, vous pouvez accélérer la réactivation des objets. Vous bénéficiez des avantages de maintenir le canal ouvert par l’activation JIT tout en atténuant le coût de la réactivation. Dans ce cas, vous pouvez utiliser le regroupement pour régir la quantité de mémoire que vous souhaitez allouer aux objets dont les références sont actives.

Vous êtes le plus susceptible de regrouper des composants activés par JIT lorsqu’ils sont transactionnels. Le regroupement d’objets est optimisé pour gérer les composants transactionnels. Pour plus d’informations, consultez Regroupement d’objets transactionnels.

Chaînes du constructeur d’objet COM+

Contrôle de la durée de vie et de l’état de l’objet

Fonctionnement du regroupement d’objets

Regroupement d’objets transactionnels

Configuration requise pour les objets pouvant être mis en pool