Como evitar unboxing - sobrecarga de memória de boxe ao ler linhas SQL arbitrários

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

  •  12-09-2019
  •  | 
  •  

Pergunta

Eu estou escrevendo uma classe para representar uma linha de uma consulta SQL. Eu quero que os dados de campo para ser acessado através da propriedade do indexador da classe. Este é o suficiente simples se eu carregar os dados em uma lista interna de objeto. Eu já tentei isso e não estou feliz com o boxe para os primitivos. Boxe aumenta o requisito de memória em 20%. Eu gostaria de armazenar os primitivos como primitivos na classe. As lojas de classe DataTable primitivas de criação de matrizes para cada coluna no esquema retornou de IDataReader. Eu implementei uma classe desta forma, mas eu preferiria que os dados sejam armazenados com o objeto de linha em vez de em uma coluna que é referenciada internamente pela linha.

Todas as ideias sobre realizar isso?

Foi útil?

Solução

Você pode gerar tipo de estrutura para representar uma linha. Isso pode ser feito de forma dinâmica e é possível fazê-lo de modo que não haverá qualquer boxe. Não estou certo de que é digno o esforço embora

Outras dicas

Apenas 20% sobrecarga? Você é sortudo! Eu só limparam algum código onde ele acrescentou uma diminuição de desempenho quarenta vezes (sem contar o impacto da memória extra)! De qualquer forma, a maneira típica para evitar usando object está começando usando os genéricos. Aqui está um exemplo simplificado:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top