какая целая ширина обрабатывается быстрее в C? - PullRequest
5 голосов
/ 31 декабря 2010

Есть ли разница в скорости, когда я использую 16-битное или 32-битное целое число на 32-битном процессоре? Или 32-разрядный или 64-разрядный тип int на 64-разрядной архитектуре?

Другими словами, если у меня есть какое-то значение, которое вписывается в диапазоны uint16_t, должен ли я использовать «unsigned int» вместо этого, если производительность имеет значение?

Ответы [ 5 ]

15 голосов
/ 31 декабря 2010

Заголовок <stdint.h> предоставляет typedef для «самых быстрых целочисленных типов, имеющих хотя бы определенную указанную ширину», что может быть полезно в вашем случае:

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

Имя typedef int_fastN_t обозначает самый быстрый целочисленный тип со знаком с шириной не менее N. Имя typedef uint_fastN_tобозначает самый быстрый целочисленный тип без знака с шириной не менее N.

Требуются следующие типы:

int_fast8_t               uint_fast8_t  
int_fast16_t              uint_fast16_t  
int_fast32_t              uint_fast32_t  
int_fast64_t              uint_fast64_t  
3 голосов
/ 31 декабря 2010

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

Единственное хорошее применение, которое я могу придумать для uint16_t или int16_t, - это 16-битные аудиосэмплы (все еще преобладающий формат для аудио). В противном случае просто используйте обычный тип, который, как вы знаете, будет достаточно большим. int всегда по крайней мере 16-битный, а в POSIX и Windows он по крайней мере 32-битный.

Если вам нужно сохранить количество объектов, всегда используйте size_t, а если вам нужно сохранить смещение файла, всегда используйте off_t (к сожалению, доступно только в POSIX).

2 голосов
/ 31 декабря 2010

Обычно все операции выполняются над собственным словом машины, поэтому вы можете получить небольшой штраф при использовании меньших типов (например, передача short int, когда ожидается int, будет использовать код операции расширения знака).Но они были бы быстрее, если бы могли использоваться инструкции SSE!

И, конечно, намного больший штраф при использовании больших типов, чем машинное слово:)
Также будьте осторожны со знаковыми / беззнаковыми операндами, в некоторых случаях это может иметь значение.

Здесь вы можете найти больше об этом.

1 голос
/ 31 декабря 2010

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

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

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

0 голосов
/ 31 декабря 2010

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

Для всех других программ правильность и переносимость (в таком порядке) должны вызывать гораздо большее беспокойство. Поэтому вы всегда должны использовать «универсальные» типы и typedef s, которые C (и, возможно, ваша платформа) предусматривают для специальных целей.

  • Любой тип подсчета и индексации должно быть сделано с size_t.
  • Различия и относительные положения должно быть сделано с ptrdiff_t.
  • Коды ошибок и возврата из стандартного библиотека или системные вызовы обычно int.
  • В символьных строках используется char или wchar_t.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...