Как предотвратить распаковку - накладные расходы на бокс-память при чтении произвольных строк sql
Вопрос
Я пишу класс для представления строки из запроса SQL.Я хочу, чтобы доступ к данным поля осуществлялся через свойство индексатора класса.Это достаточно просто, если я загружаю данные во внутренний список объектов.Я это уже пробовал и бокс для примитивов меня не устраивает.Бокс увеличивает требования к памяти на 20%.Я хотел бы сохранить примитивы как примитивы в классе.Класс DataTable хранит примитивы, создавая массивы для каждого столбца в схеме, возвращаемой из IDataReader.Я реализовал класс таким образом, но предпочел бы, чтобы данные хранились в объекте строки, а не в столбце, на который строка ссылается внутри.
Есть идеи по этому поводу?
Решение
Вы можете создать тип структуры для представления строки.Это можно сделать динамически и можно сделать так, чтобы не было никакого бокса.Хотя я не уверен, что это стоит затраченных усилий
Другие советы
Только 20% накладных расходов?Ты счастливчик!Я только что почистил код, в котором производительность снизилась в сорок раз (не считая влияния дополнительной памяти)!В любом случае, типичный способ предотвратить использование object
это начать использовать дженерики.Вот упрощенный пример:
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