Como evitar unboxing - sobrecarga de memória de boxe ao ler linhas SQL arbitrários
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?
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