¿Cómo prevenir unboxing - sobrecarga de la memoria al leer el boxeo filas SQL de su elección

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

  •  12-09-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una clase para representar una fila de una consulta SQL. Quiero tener acceso a los datos de campo a través de la propiedad indexador de la clase. Esto es bastante sencillo si me carga los datos en una lista interna de objetos. Ya he probado esto y no estoy contento con el boxeo para las primitivas. Boxeo aumenta los requisitos de memoria en un 20%. Me gustaría almacenar las primitivas como primitivas de la clase. La clase DataTable almacena primitivas mediante la creación de matrices para cada columna en el esquema de regresar de IDataReader. He implementado una clase de esta manera, pero yo preferiría que los datos se almacenan con el objeto de fila en lugar de en una columna que se hace referencia internamente por la fila.

¿Alguna idea sobre el cumplimiento de esta?

¿Fue útil?

Solución

Puede generar tipo de estructura para representar una fila. Se puede hacer de forma dinámica y es posible hacerlo por lo que no habrá ningún boxeo. No estoy seguro de que es digno el esfuerzo aunque

Otros consejos

Sólo el 20% de arriba? ¡Tienes suerte! Acabo de limpiar un poco de código en la que se añade una disminución del rendimiento cuarenta veces (sin contar el impacto de la memoria adicional)! De todos modos, la forma típica para evitar el uso de object es empezar utilizando los genéricos. Aquí está un ejemplo 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top