Эффективные преимущества данных размером в 2 размера?

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

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

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

Ответы

Ответ 1

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

Тем не менее, есть темная сторона для данных размера "большой мощности". И это может поразить вас, когда вы меньше всего этого ожидаете.

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

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

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

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


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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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