2009-08-14 6 views
1

J'ai une configuration similaire au système DependencyProperty et DependencyObject de WPF. Mes propriétés sont cependant génériques. Un BucketProperty a un GlobalIndex statique (défini dans BucketPropertyBase) qui suit tous les BucketProperties. Un Bucket peut avoir plusieurs BucketProperties de n'importe quel type. Un Bucket enregistre et obtient les valeurs réelles de ces BucketProperties ... maintenant, ma question est, comment gérer le stockage de ces valeurs, et quelle est la peine d'utiliser un typecasting lors de leur récupération? J'utilise actuellement un tableau de BucketEntries qui enregistre les valeurs de propriétés en tant qu'objets simples. Existe-t-il un meilleur moyen de sauvegarder et de rendre ces valeurs?Pénalité de performance des types de typage et de boxe/déballage en C# lors du stockage de valeurs génériques

dessous est une version simpliefied:

public class BucketProperty<T> : BucketPropertyBase 
{ 

} 

public class Bucket 
{ 
    private BucketEntry[] _bucketEntries; 

    public void SaveValue<T>(BucketProperty<T> property, T value) 
    { 
     SaveBucketEntry(property.GlobalIndex, value) 
    } 
    public T GetValue<T>(BucketProperty<T> property) 
    { 
     return (T)FindBucketEntry(property.GlobalIndex).Value; 
    } 
} 

public class BucketEntry 
{ 
    private object _value; 
    private uint _index; 
     public BucketEntry(uint globalIndex, object value) 
     { 
      ... 
     } 
} 

Répondre

0

J'ai créé une configuration très similaire après avoir lu Rockford Lhotka de book on Business Objects mais j'évité la question de la boxe objet en forçant l'implémenteur de la propriété pour maintenir un support typé champ à la place. Je sais que c'est un compromis, mais dans mon cas, j'ai apprécié la performance par rapport à la simplicité de déclarer de nouvelles propriétés. Afin de gérer le type tout au long des recherches de propriétés et de la gestion, j'utilise très fortement les expressions et génériques Lambda et jusqu'ici tout va bien, je suis en train de dépasser les performances des objets de dépendance et de CSLA.

Pour répondre à votre question, oui vous aurez un coup de performance en utilisant la boxe d'objets et aussi pour les types de valeur soutenus par ces propriétés que vous garderez en gardant un pointeur supplémentaire dans le tas pour chaque valeur doublant la mémoire empreinte pour ces valeurs. En ce qui concerne la quantité de performance que vous allez prendre dépend de la façon dont lire et écrire régulièrement à ces propriétés parmi d'autres facteurs. Si vous souhaitez avoir une idée de la différence de performances, il serait probablement judicieux de créer une petite application de test qui exécute une boucle et place des entiers en tant qu'objet et les décompacte plutôt que de stocker les mêmes valeurs dans un champ normal. Je pense que si vous ne faites pas de boxe d'objets et que vous ne faites pas de boxe, vous augmenterez probablement vos performances d'au moins 2 fois, mais ne prenez pas ma parole pour faire le test.

Questions connexes