Избегайте бокса в DbParameter.Value?

2

Я использую ADO.NET для связи с некоторыми db и ищет способ избежать бокса при установке свойства DbParameter.Value в тип значения.

Есть ли способ избежать бокса в DbParameter.Value?

Спасибо.

Теги:
performance
ado.net
boxing

3 ответа

2
Лучший ответ

Я так не думаю. Если вы изучите свойство Value класса SqlParameter в Reflector, вы увидите, что внутреннее поле, в котором хранится значение, также относится к типу объекта. Там нет места для хранения ints или floats или каким-либо другим способом.

7

Почему вы хотите избежать этого? Стоимость работы бокса, вероятно, почти ничего не стоит в контексте общего уровня доступа к данным. Сериализация значения параметра только на проводе, вероятно, в 100 раз превышает стоимость бокса. Вы видите проблему с производительностью, связанную с боксом?

  • 0
    Проблема не в самом боксе, проблема в GC, который должен собрать все эти версии в штучной упаковке позже. Процесс, который запускает его, потребляет 100% ресурсов процессора, поэтому я хочу оптимизировать все те мелочи, которые могут заставить GC работать дольше.
  • 0
    Я не думаю, что 100% загрузка ЦП вызвана GC. GC не работает постоянно, он запускается, когда нужно ...
2

Вы не можете избежать использования вложенных значений, но вы можете избежать фактического бокса. Вернее, вы можете изменить, как и когда происходит бокс.

Вы можете подготовить значения в боксе для использования в параметрах, например:

object[] boxedIntegers = new object[100];
for (int i = 0; i < boxedIntegers.Length; i++) {
   boxedIntegers[i] = i;
}

Пока вы храните массив, значения в коробке могут использоваться снова и снова, не вызывая больше бокса, и они не будут собраны до тех пор, пока массив не выйдет из употребления.

Сомнительно, что бокс действительно вызывает проблемы с производительностью, но теперь у вас есть способ провести какое-то реальное тестирование по крайней мере.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню