Преимущества производительности данных размером с полномочия 2? - PullRequest
17 голосов
/ 01 марта 2012

Если у меня есть игра, в которой есть трехмерный мир, и мир довольно большой, поэтому его нужно разбить на куски, есть ли главное, если таковое имеется, преимущество в производительности при наличии 128-байтовых блоков, скажем, 150-байтовых блоков?Очевидно, что объекты в чанках по-прежнему имеют целое число байтов в размере.

, т. Е. chunks[128][128][128] быстрее, чем chunks[150][150][150] или chunks[112][112][112]?Есть ли другие побочные эффекты, такие как чрезмерная потеря ОЗУ после этого?Есть ли какие-то другие факторы, которые следует принимать во внимание?

Я просто вижу, что принято хранить все в переменных и массивах размеров, которые имеют степень 2, но я не уверен, есть ли какая-либо заслугак этому, и если бы это могло быть лучше использовать больше человеческих чисел, таких как 100 или 150.

Ответы [ 5 ]

21 голосов
/ 07 марта 2012

Другие ответы на самом деле верны, так как данные со степенью двойки выиграют от использования сдвигов над умножениями.

Однако , есть темная сторона к размеру данных степени двух.И он может поразить вас, когда вы меньше всего этого ожидаете.

См. Эти два вопроса / ответа:

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

Хотя это может показаться желательным, они могут привести к:

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


Так же, как свсе вопросы производительности, вы должны измерить, измерить, измерить ... И будьте готовы ожидать, что что-нибудь случится.

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

3 голосов
/ 01 марта 2012

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

Если вы глубже разберетесь в распределителях и диспетчерах памяти ОС, вы увидите, что они управляют всем в степени двух степеней. Операционная система обычно управляет памятью процесса в терминах страниц, и в настоящее время размер страницы обычно составляет 4096 байт. Поэтому, если вы хотите выделить часть размером 4000 байтов, ОС все равно выделит 4096 байтов, а оставшиеся 96 байтов будут потрачены впустую.

2 голосов
/ 01 марта 2012

Если вы получаете доступ к данным следующим образом:

chunks[150][150][150]
chucks[x][y][z] = 123;

Тогда процессор должен умножить (что-то вроде: z + 150 * (y + 150 * x) ...) для получения адреса.

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

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

1 голос
/ 01 марта 2012

Способности двух часто используются в программном обеспечении, потому что это числовая база, которую используют компьютеры.

Например, ОС будут выделять память в размерах блоков степеней два, размеры кэша в процессоре - степени двух, размеры адресов - степени двух и т. Д.

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

По сути, обеспечение того, что все использует полномочия двух , может повысить производительность вашего программного обеспечения, но обычно компилятор и / или ОС гарантируют, что ваши данные будут эффективно использоваться при использовании произвольных размеров.

0 голосов
/ 27 января 2014

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

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

...