2013-10-05 2 views
4

Начнем с малого, скажем, мне нужно сохранить значение const 200, должен ли я всегда использовать байк без знака для этого?Какие типы данных использовать? И как CPU их читает?

Это всего лишь минимальная вещь, я думаю. Но как насчет структур? Уместно ли строить мои структуры так, чтобы они были делятся на 32 на 32-битной системе? Предположим, мне нужно перебрать очень большой массив структур, имеет ли значение значение, если структура состоит из 34 бит или 64? Я думаю, что это сильно выиграет, если я могу выжать 2 бита из 34-битной структуры?

Или все это делает ненужные накладные расходы, и мне лучше заменить все мои биты и шорты на int внутри этой структуры, чтобы процессор не должен «искать» для правильного блока памяти?

+1

Вместо этого вы можете попросить об этом на http://programmers.stackexchange.com. –

+0

для локальных переменных go с целыми целыми числами. Для массивов идут с наименьшим подходящим типом. Для полей это зависит от контекста. – CodesInChaos

ответ

8

Это сильная деталь реализации процессора, CLR и джиттер уже выполняют большую работу, чтобы гарантировать, что ваши типы данных оптимальны, чтобы получить лучший перформанс из программы. Например, никогда не бывает, когда структура когда-либо занимает 34 бита, выбор дизайна CLR уже гарантирует, что вы начнете работать с использованием типов, которые хорошо работают на современных процессорах.

Структуры выложены оптимальными и включают в себя выравнивание варианты, которые зависят от типа данных. Например, значение int будет выровнено со смещением, кратным 4. Это дает процессору простое время для считывания int, ему не нужно мультиплексировать смещенные байты обратно в int и избегать сценарий, в котором значение привязывает кэш-строку cpu, и его необходимо склеить из нескольких считываний шины памяти. Некоторые события процессоров обрабатывают несогласованные чтения и записи как фатальные ошибки, одна из причин, по которым у вас нет Itanium на вашем компьютере.

Итак, если у вас есть структура с байтом и int, то вы получите тип данных, который занимает 8 байтов, который не использует 3 байта, между байтом и int. Эти неиспользуемые байты называются padding. В конце структуры также может быть отступы, чтобы гарантировать, что выравнивание по-прежнему оптимально, когда вы помещаете их в массив.

Объявление одной переменной как байта в порядке, процессоры Intel/AMD занимают одинаковое количество времени для чтения/записи в виде 32-битного int. Но использование short не подходит, для этого требуется дополнительный байт в инструкции процессора (префикс переопределения размера) и может стоить дополнительный цикл процессора. На практике вы не часто сохраняете память из-за правила выравнивания. Использование байта покупает только что-нибудь, если его можно комбинировать с другим байтом. Массив байтов в порядке, структура с несколькими байтовыми элементами отлично. Ваш пример - нет, он работает так же хорошо, когда вы его объявляете int.

Использование типов, меньших, чем int, может быть неудобным в коде C#, модель кода MSIL основана на int. Основные операторы, такие как + и -, определены только для int и больше, для меньших типов нет оператора. Таким образом, вам нужно использовать бросок, чтобы урезать результат до меньшего размера. Сладкое пятно int.

+0

Итак, что я прочитал в заключительном параграфе, так это то, что мне часто лучше использовать структуру, полную ints с низкими значениями для лучшей производительности? И на самом деле на самом деле остается только сократить потребление памяти? Я много использовал шорты. Я сделал некоторое чтение, и теперь мне интересно, когда использовать короткое время. : D – Madmenyo

+0

Erm, нет, структура должна иметь не более 4 тс. Он перестает быть эффективным типом значения, если он имеет больше, копирование становится дорогим, и для хранения полей недостаточно регистров процессора. Вместо этого переключитесь на класс. И нет, «низкие значения» вообще не влияют на perf. Но да, получить пробег из короткого довольно сложно. Только когда-либо рассматривайте его для больших массивов. –

+0

Но класс имеет намного больше накладных расходов, чем структура, если я получаю доступ к нему много прав? Мне лучше иметь несколько структур, если я превышу этот 4-х предел? Массив, который я использую, должен содержать до 16 миллионов структур. – Madmenyo

1

Вау, это действительно зависит от множества вещей. Вас беспокоит производительность или память? Если это производительность, вам, как правило, лучше оставаться с «естественным» выравниванием размера слова. Так, например, если вы используете 64-битный процессор с использованием 64-битных целых чисел, выравнивание по 64-битным границам обеспечивает лучшую производительность. Я не думаю, что C# дает какие-либо гарантии в отношении этого типа вещей (он должен оставаться абстрактным от аппаратного обеспечения).

Это неформальное правило, в котором говорится: «Избегайте греха преждевременной оптимизации».Это особенно верно в C#. Если у вас нет проблемы с производительностью или памятью, не беспокойтесь об этом.

Если вы обнаружили, что у вас проблемы с производительностью, используйте профилировщик, чтобы определить, где проблема на самом деле (возможно, это не так, как вы думаете). Если это проблема с памятью, определите объекты, которые потребляют большую часть памяти, и определите, где вы можете оптимизировать (в соответствии с вашим примером, используя байты, а не int или короткие, если это возможно).

Если вам действительно нужно беспокоиться о таких деталях, вы можете рассмотреть возможность использования C++, где вы можете лучше контролировать использование памяти (например, вы можете выделить большие блоки памяти без инициализации), получить доступ к битполам и т. Д.

+0

Я ищу лучшую производительность по использованию памяти. Я соглашаюсь на преждевременную оптимизацию, но я прошу только для обучения, поскольку я часто задаю себе вопрос, какой тип использовать. И, в конце концов, это экономит много времени, делая это «правильно» в первый раз, если это возможно в определенном случае. Я предпочел бы придерживаться C#, поскольку он дает мне всю свободу, в которой я нуждаюсь, я чувствую себя комфортно с ней, и она развивается быстрее, чем C++, когда вы ставите их на равных условиях (без библиотек). – Madmenyo

Смежные вопросы