Come prevenire unboxing - sovraccarico di memoria boxe, quando la lettura di file SQL arbitrarie

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

  •  12-09-2019
  •  | 
  •  

Domanda

Sto scrivendo una classe per rappresentare una riga da una query SQL. Voglio che i dati del campo a cui accedere tramite la proprietà indicizzatore della classe. Questo è abbastanza semplice se io carico i dati in un elenco interno di oggetto. Ho già provato questo e non sono felice con la boxe per i primitivi. Boxe aumenta il fabbisogno di memoria del 20%. Vorrei memorizzare i primitivi come primitivi nella classe. La classe DataTable memorizza le primitive per la creazione di array per ogni colonna nello schema tornato da IDataReader. Ho implementato una classe questo modo, ma preferirei i dati da memorizzare con l'oggetto riga piuttosto che in una colonna a cui fa riferimento internamente dal riga.

Tutte le idee su realizzare questo?

È stato utile?

Soluzione

È possibile generare tipo di struttura per rappresentare una riga. Si può fare in modo dinamico ed è possibile farlo in modo non ci sarà alcun boxe. Io non sono sicuro che è degno lo sforzo se

Altri suggerimenti

Solo il 20% in testa? Sei fortunato! Ho appena ripulito un po 'di codice in cui si aggiunge una riduzione delle prestazioni quaranta volte (senza contare l'impatto della memoria aggiuntiva)! In ogni caso, il tipico modo per evitare usando object è avviando utilizzando farmaci generici. Ecco un esempio semplificato:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top