Должен ли я использовать наименьший возможный тип?

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

Я слышал обоснование того, что 32-битное значение извлекается так же быстро, как 8-битное, но у процессоров есть какой-то способ одновременного извлечения нескольких меньших значений. Верно?

Итак, если я использую 4 байта вместо 4 целых чисел, разве компилятор не сможет оптимизировать это, чтобы 4 байта извлекались/сохранялись в одном 32-битном регистре?

Или все это действительно преждевременная оптимизация, а потенциальный прирост производительности ничтожен?


person simendsjo    schedule 24.02.2011    source источник
comment
Преждевременная оптимизация - это правильно!   -  person Lasse V. Karlsen    schedule 24.02.2011
comment
Я бы сказал: если это занимает много места (например, выделение 1 миллиарда элементов чего-либо), используйте наименьший тип, иначе используйте то, что вы хотите/нравится, компилятор оптимизирует производительность для вас.   -  person schnaader    schedule 24.02.2011


Ответы (3)


Действительно преждевременная оптимизация! Однако, как только вы оптимизируете, это также зависит от вашей архитектуры. Например, в ARM доступ к памяти должен быть 32-битным (некоторые инструкции могут это делать, но они просто выполняют 32-битный доступ, а затем маскируют/смещают за кулисами). Если вы используете байт, компилятор часто выделяет каждому «байту» четыре фактических байта ОЗУ, чтобы к нему можно было получить доступ быстрее (не говоря уже о том, что ЦП будет волноваться, если вы попытаетесь получить доступ к невыровненным байтам без специального кода для их обработки).

Существует аргумент в пользу использования «int» для всего, поскольку это предпочтительный размер ЦП, но в основном просто используйте тип нужного вам размера, и пусть компилятор позаботится об оптимизации: D

person electric-monk    schedule 24.02.2011

Это зависит. Если вы работаете на небольшом процессоре с небольшим кэшем, то выбор наименьшего размера данных может иметь смысл. Если у вас есть большие объемы данных, например, миллионы выборок, каждая из которых требует 8-битной точности, то имеет смысл использовать наименьший размер данных. В большинстве других случаев оставьте это компилятору.

person qbert220    schedule 24.02.2011

В 32-разрядном ЦП упаковка четырех 8-разрядных байтов в 32-разрядное слово может сократить время доступа к памяти, поскольку одновременно можно получить четыре байта. Однако теперь, чтобы манипулировать одним байтом, ЦП должен выполнять дополнительные сдвиги и маски и т. д. Таким образом, либо упаковка 4 байтов в слово, либо оставление каждого байта неупакованным (используя 32 бита для каждого 8-битного байта) имеет плюсы и минусы

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

Однако есть и другие ЛУЧШИЕ причины для использования типа, соответствующего домену ваших данных: ясность, ремонтопригодность и т. д. Я думаю, что это действительно козырная оптимизация, которая касается 99% времени.

person wjl    schedule 24.02.2011