Быстрее использовать целые числа в качестве логических значений? - PullRequest
2 голосов
/ 06 мая 2011

С точки зрения доступа к памяти ... стоит ли пытаться выполнить такую ​​оптимизацию?

int boolean_value = 0;

//magical code happens and boolean_value could be 0 or 1

if(boolean_value)
{
   //do something
}

Вместо

unsigned char boolean_value = 0;

//magical code happens and boolean_value could be 0 or 1

if(boolean_value)
{
   //do something
}

Беззнаковый символ, конечно, занимает всего 1 байт.в отличие от целых чисел 4 (при условии, что здесь используется 32-разрядная платформа), но, насколько я понимаю, процессор будет быстрее читать целочисленное значение из памяти.

Ответы [ 5 ]

7 голосов
/ 06 мая 2011

Может быть, а может и не быть быстрее, а скорость зависит от стольких вещей, что общий ответ невозможен. Например: аппаратная архитектура, компилятор, опции компилятора, объем данных (вписывается ли он в кэш L1?), Другие вещи, конкурирующие за процессор и т. Д.

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

Если измерение не показывает, что один метод значительно быстрее другого, выберите более четкий.

3 голосов
/ 06 мая 2011

С точки зрения доступа к памяти ... стоит ли пытаться выполнить такую ​​оптимизацию?

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

Но, как говорили другие, не повредит попробовать и измерить его.

3 голосов
/ 06 мая 2011

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

2 голосов
/ 06 мая 2011

Вопрос о том, сколько памяти unsigned char занимает против int, имеет смысл только в том случае, если он находится в массиве (или, возможно, в структуре, если вы тщательно упорядочиваете элементы, чтобы заботиться о выравнивании) , Как одиночная переменная, очень маловероятно, что вы вообще сохраните какую-либо память, и компилятор, скорее всего, сгенерирует больший код для усечения старших битов регистров.

Как правило, никогда не используйте типы меньше чем int, за исключением массивов, если у вас нет действительно веской причины , кроме попыток сэкономить место .

0 голосов
/ 06 мая 2011

Следуйте стандартным правилам оптимизации.Во-первых, не оптимизируйте.Затем проверьте, нужен ли ваш код в какой-то момент.Затем оптимизируйте этот момент.Эта ссылка дает отличное введение в тему оптимизации.

http://www.catb.org/~esr/writings/taoup/html/optimizationchapter.html

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