Comment éviter unboxing - surcharge de la mémoire lors de la lecture de boxe lignes SQL arbitraires

StackOverflow https://stackoverflow.com/questions/1842838

  •  12-09-2019
  •  | 
  •  

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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top