Эффективные преимущества данных размером в 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
Это может быть быстрее, оно может быть медленнее, это может быть одна и та же скорость. Было бы очень сложно дать правильный ответ, просто взглянув на код. Итак, ответ: Измерьте это, измените код и измерьте его снова. Если ваш код должен работать на разных компьютерах, измерьте его на каждом.
Я бы предпочел предположить, что выравнивание мощности в два раза часто требует серьезных проблем, и что использование большего объема памяти, чем необходимо, не поможет в производительности. Часто помогает помощь с большим количеством операций с небольшой частью памяти, которая вписывается в некоторый кеш, а затем переключается на следующую часть памяти. Доступ к последовательным адресам памяти часто помогает. Часто помогает помощь округления, так что вы можете использовать векторные операции.