Использует ли небольшие типы данных (например, короткие вместо int) сокращение использования памяти?

Мой вопрос в основном о том, как компилятор С# обрабатывает выделение памяти небольшими типами данных. Я знаю, что, например, такие операторы, как add, определяются по int, а не по короткому, и поэтому вычисления будут выполняться так, как если бы шорты были членами int.

Предполагая следующее:

  • Нет логики бизнес-логики/валидации, связанной с выбором short в качестве типа данных
  • Мы ничего не делаем с небезопасным кодом

Использует ли короткий тип данных, где это возможно, уменьшение объема памяти моего приложения и целесообразно ли это делать? Или использует короткий и т.п., Не стоит того, что компилятор выделяет полный объем памяти для int32, например, и добавляет дополнительные приведения при выполнении арифметики.

Приветствуются любые ссылки на предполагаемое влияние производительности во время выполнения.

Похожие вопросы:

Почему я должен использовать int вместо байта или short в С#

Целое суммирование блюза, короткое + = короткая проблема

Ответы

Ответ 1

С точки зрения памяти лучше использовать short вместо int. Простая причина в том, что переменная short нуждается только в половине размера переменной int в памяти. CLR не расширяет short до int в памяти.

Тем не менее это сокращение потребления памяти может и, возможно, значительно снизит производительность во время выполнения вашего приложения. Все современные процессоры работают намного лучше с 32-битными номерами, чем с 16-битными номерами. Кроме того, во многих случаях CLR придется преобразовывать между short и int, когда, например, вызывающих методы, которые принимают аргументы int. Есть много других соображений производительности, которые вы должны предпринять, прежде чем идти этим путем.

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

В некоторых случаях вы можете, конечно, переключиться с int на short без ущерба для производительности. Одним из примеров является гигантский массив int, который также подходит для short s.

Ответ 2

Это имеет смысл с точки зрения использования памяти, только если у вас в вашей программе очень большие массивы (или коллекции, построенные на массивах типа List<>) этих типов, или массивы упакованных структур, составленные из них. По большому счету я имею в виду, что общий объем памяти этих массивов - это большой процент рабочего набора и большой процент доступной памяти. Что касается целесообразности, я бы рискнул, что нецелесообразно использовать короткие типы, если только данные, на которые работает ваша программа, явно указаны в терминах short и т.д., Или объем данных бежит в гигабайты.

Ответ 4

В зависимости от того, для чего вы используете шорты. Кроме того, выделяете ли вы много переменных, которые занимают память?

Если эта программа будет использоваться на мобильном устройстве или устройстве с ограничениями памяти, я могу быть обеспокоен. Тем не менее, большинство компьютеров сегодня работают не менее 1-2 ГБ оперативной памяти и имеют довольно приличные двухъядерные процессоры. Кроме того, большинство мобильных устройств сегодня становятся мини-компьютерами для животных. Если вы заявляете, что машина такого типа начнет умирать, у вас уже есть проблема с вашим кодом.

Однако в ответ на вопрос. Это может иметь значение в ограниченных объемах памяти, если вы объявляете много 4 байтовых переменных, когда вам нужна только 2-байтная переменная, чтобы заполнить их, тогда вам следует использовать короткий текст.

Если вы выполняете сложные вычисления, квадратные корни и такие, или вычисления с высокой стоимостью. Тогда вы, вероятно, должны использовать переменные с большим количеством байтов, чтобы не потерять какие-либо данные. Просто объявляйте, что вам нужно, когда вам это нужно. Измените его, если вы сделали это, чтобы убедиться, что С# очищает его, если вы беспокоитесь об ограничениях памяти.

Ответ 5

Когда дело доходит до машинного языка, на уровне реестра, я думаю, что лучше согласовать его с размером реестра, поскольку большинство функций перемещения и арифметики выполняются в границах реестра. Если на компьютере установлен 32-разрядный набор реестров, лучше выровнять его с 32-битным. Если на машине установлены 16-разрядные реестры для операций ввода-вывода, хорошей практикой является согласование с 16-битным, чтобы уменьшить количество операций перемещения содержимого.