Как предотвратить распаковку - накладные расходы на бокс-память при чтении произвольных строк sql

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

  •  12-09-2019
  •  | 
  •  

Вопрос

Я пишу класс для представления строки из запроса 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top