Comment éviter unboxing - surcharge de la mémoire lors de la lecture de boxe lignes SQL arbitraires
Question
J'écris une classe pour représenter une ligne d'une requête SQL. Je veux que les données sur le terrain à accéder via la propriété indexeur de la classe. Cela est assez simple si je charge les données dans une liste interne de l'objet. Je l'ai déjà essayé cela et ne suis pas satisfait de la boxe pour les primitives. Boxe augmente l'exigence de mémoire de 20%. Je voudrais stocker les primitives comme primitives dans la classe. La classe stocke DataTable primitives en créant des tableaux pour chaque colonne dans le schéma de retour IDataReader. Je mis en œuvre une classe de cette façon, mais je préférerais les données être stockées avec l'objet de la ligne plutôt que dans une colonne qui est référencée en interne par la ligne.
Toutes les idées sur l'accomplissement de cette?
La solution
Vous pouvez générer le type de structure pour représenter une ligne. Il peut être fait de façon dynamique et il est possible de le faire, donc il n'y aura pas de la boxe. Je ne suis pas sûr qu'il est digne de l'effort que
Autres conseils
Seulement 20% de frais généraux? Tu es chanceux! Je viens de nettoyer un peu de code où il a ajouté une diminution de la performance fourty fois (sans compter l'impact de la mémoire supplémentaire)! Quoi qu'il en soit, la manière typique d'éviter l'utilisation object
est en commençant à l'aide de médicaments génériques. Voici un exemple simplifié:
class RowRepresenter<T>
{
//....
public T this[int index] {get; set;} // implementation left out
}
// initialize, suppose the properties (indexers) should be ints:
RowRepresenter<int> myInstance = new RowRepresenter<int>();
myInstance.LoadData();
// get data (i.e., your indexer)
int somefield = myInstance[2]; // no overhead, no casting required