Являются ли char и small int медленнее, чем int?

Возможный дубликат:
Производительность встроенных типов: char, short, int, float, double

Привет. Предположим, у вас 32-разрядный процессор. Являются ли 8-битные char и 16-битные short int медленнее, чем собственные 32-битные int? Как насчет использования 64-битной версии long long int?

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

В случае, если мне нужно хранить небольшое количество символов, не быстрее ли хранить их как целые числа?


person Artur Iwan    schedule 18.03.2011    source источник
comment
Если вы храните небольшое количество символов, почему вас беспокоит потенциальная разница в наносекундах?   -  person Erik    schedule 18.03.2011
comment
@Erik: одну переменную можно использовать миллионы раз. Ваш аргумент не следует.   -  person R.. GitHub STOP HELPING ICE    schedule 18.03.2011
comment
@R.: И использование более широких типов для символов может увеличить количество промахов в кеше. Бессмысленная оптимизация, пока профайлер не докажет обратное.   -  person Erik    schedule 18.03.2011
comment
@Erik: Что такое промахи кеша? В нескольких словах, мне не нужно полное определение :) спасибо   -  person Artur Iwan    schedule 18.03.2011
comment
Процессоры хранят недавно использованную область памяти в быстрой оперативной памяти. Эта оперативная память является кэшем для гораздо более медленной основной памяти.   -  person Michael Dorgan    schedule 18.03.2011
comment
@R.. Не нравится, как Эрик сменил тему и обратился к соломенному человеку. И что с людьми, которые не могут написать ваш идентификатор пользователя.   -  person Jim Balter    schedule 18.03.2011
comment
Оптимизация имеет значение, и научиться делать что-то максимально быстро — это хорошо! . Пожалуйста, прекратите преждевременную пессимизацию.   -  person Researcher    schedule 03.05.2016
comment
Украдено непосредственно из связанного дубликата выше: как правило, процессоры быстрее всего работают с целыми числами своего собственного размера слова (с некоторыми оговорками о 64-битных системах). 32-разрядные операции часто выполняются быстрее, чем 8- или 16-разрядные операции на современных ЦП, но это сильно различается между архитектурами. Кроме того, помните, что вы не можете рассматривать скорость процессора изолированно; это часть сложной системы.   -  person Researcher    schedule 03.05.2016
comment
Даже если работа с 16-битными числами в 2 раза медленнее, чем работа с 32-битными числами, вы можете поместить в иерархию кэша в два раза больше данных, если будете представлять их 16-битными числами вместо 32-битных. Если в этом разница между получением всех ваших данных из кеша вместо частых промахов кеша, то более быстрый доступ к памяти превзойдет более медленную работу ЦП.   -  person Researcher    schedule 03.05.2016
comment
Кэш имеет гораздо большее значение, чем операции ЦП, если вы перебираете наборы данных, поэтому я бы поспорил, что меньшие размеры будут быстрее - сейчас готовим тест.   -  person Researcher    schedule 03.05.2016
comment
Я не могу опубликовать код, так как он закрыт, см. Мой ответ на дубликат: stackoverflow.com/questions/5069489/   -  person Researcher    schedule 03.05.2016


Ответы (2)


На любой современной практичной машине char, int и long будут работать быстро (вероятно, одинаково быстро). Является ли short быстрым или нет, несколько зависит от архитектуры процессора и даже от разных моделей процессоров в рамках одной архитектуры.

С учетом сказанного, на самом деле нет веской причины использовать маленькие типы для одиночных переменных, независимо от их скорости. Их семантика сбивает с толку (из-за повышения по умолчанию до int), и они не сэкономят вам много места (возможно, даже не сэкономят места). Единственный раз, когда я когда-либо использовал бы char, short, int8_t, int16_t и т. д., это в массивах или структурах, которые должны соответствовать фиксированному двоичному макету, где у вас будет так много из них (например, пиксели или аудиосэмплы), что размер каждого из них действительно имеет значение.

person R.. GitHub STOP HELPING ICE    schedule 18.03.2011
comment
Действительно? Например, вы бы использовали int для логического значения вместо подписанного char? - person Spidey; 20.04.2012
comment
Конечно. Мало того, что он может генерировать меньший и более быстрый код; это также более идиоматично. Все стандартные функции C, которые возвращают истинные значения, используют int в качестве типа возвращаемого значения, а значение всех операций сравнения/булевых операторов в C имеет тип int. - person R.. GitHub STOP HELPING ICE; 21.04.2012
comment
Я слишком склонен к минималистичному дизайну, чтобы думать, что это правильно. ржу не могу. Я попробую использовать это с этого момента. - person Spidey; 23.04.2012
comment
@Spidey: я рекомендую не использовать int там, где вы имеете в виду bool или char. Используйте тот тип, который вам нужен. - person David Stone; 15.05.2012
comment
Также обратите внимание, что подписанность может иметь значение. Например, в Arm уже давно есть инструкции для быстрой загрузки и нулевого расширения байтов, но поддержка быстрой загрузки и знакового расширения байтов была добавлена ​​только в более поздней версии и имеет более ограничительную адресацию. - person plugwash; 29.01.2016

Это зависит от операций в наборе инструкций, а также от компилятора.

person Daniel A. White    schedule 18.03.2011