Уменьшает ли использование небольших типов данных (например, short вместо int) использование памяти? - PullRequest
14 голосов
/ 01 июня 2011

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

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

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

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

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

Вопросы, связанные с данной:

Почему я должен использовать int вместо байта или короткого в C #

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

Ответы [ 5 ]

9 голосов
/ 01 июня 2011

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

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

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

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

1 голос
/ 01 июня 2011

Короче - да.Однако вы также должны позаботиться о выравнивании памяти.Вы можете найти Мастеринг структур C # и Выравнивание памяти классов в c #? полезно

1 голос
/ 01 июня 2011

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

0 голосов
/ 23 сентября 2015

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

0 голосов
/ 01 июня 2011

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

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

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

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

...