Question

Dans mon code, je suis instancier un héritage objet Delphi via une interface COM. Cette classe doit être instanciée plusieurs fois, donc afin de réduire les frais généraux de l'instancier je en cache à un point où 70% de tous les appels ont l'objet résultant commun.

Cependant, quand je modifie l'objet après sa mise en mémoire cache, les changements sont conservés dans le cache aussi. Cela me fait penser à l'instance wrapper COM est passé par ref plutôt que par valeur.
Comment puis-je faire en sorte que l'objet en cache est passé par valeur plutôt que par ref?

Était-ce utile?

La solution

Je pense que, s'il est possible de faire du tout, vous devez cloner explicitement une copie de l'objet puis mettre en cache la copie. Voir par exemple la méthode MemberwiseClone, et d'autres mentionnés dans les réponses aux objets de clonage en C # .

Autres conseils

Tout d'abord, est-ce nécessaire?

Je ne suis pas partisan de la « mesure de résoudre tous les problèmes de performance », mais dans votre cas, vous devriez.

Les frais généraux de l'instanciation d'un objet COM (après la première pénalité d'appel) en tant que tel est très faible - rappelez-vous qu'il a été conçu pour permettre de nombreux petits objets sur les ordinateurs d'il y a 15 ans. Je suppose que les frais généraux .NET n'est pas beaucoup plus - la question est l'objet propre initialisation.

Vous pouvez vérifier facilement instanciation 1000 objets dans une boucle serrée (jeter le premier appel, il peut être très cher et serait gâcher la moyenne)

Les objets COM sont intrinsèquement par référence Il n'y a pas de méthode « passer par la valeur » pour les objets COM, comme interface de base est un pointeur compté référence à l'instance, et COM n'expose pas un générique « Clone ».

Solution possible: Copy-on-Write Si un seulement si instanciation est vraiment cher, et la majorité des appels peut être fait par une instance par défaut, vous pouvez mettre en œuvre un système de copie en écriture.

Vous devez créer une classe wrapper qui contient une référence à l'instance par défaut, et une référence à une instance privée initialisé à 0.

Tant que l'instance privée est null, toutes les fonctions de lecture en avant à l'instance par défaut, otherwis, qu'ils transmettent à l'instance privée.

Chaque poseur / renvoi d'appels imitatrice à l'instance privée, créant quand il n'existe pas.

retarderait la création de l'instance privée au premier appel mutationniste. Cependant, vous devez envelopper l'ensemble de toutes les interfaces d'intérêt pour ce composant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top