Например, если бы весь int [50] [8] использовал больше ресурсов (ОЗУ и ЦП), чем 8 полных int [50] массивов?У 2D-массивов больше ресурсов, чем 1D-массивов в Java?
ответ
В первом случае у вас есть один объект массива, указывающий на пятьдесят объектов массива, содержащих 8 int. Итак, 1 + 50 объектов массива + пятьдесят указателей в первом объекте массива.
Во втором случае у вас есть один объект массива, указывающий на 8 объектов массива, содержащих 50 int. Итак, объекты 1 + 8 массива + восемь указателей в первом объекте массива. Удержание int - это стирка.
Невозможно оценить использование ЦП для этого.
Итак, какой из них, если таковой имеется, лучше для CPU? Причина, по которой у меня возникают проблемы с процессором на Java, и единственное, о чем я могу думать, это массив. – William
@William: попробуйте профилировщик, прежде чем пытаться оптимизировать массивы. Что вы делаете с массивами? –
Здесь может быть найдено несколько вещей.
new int[50][8]
new int[8][50]
new int[400]
Теперь я получаю это запутаться, но способ помнить, думать о new int[50][]
, который действителен.
So new int[50][8]
представляет собой массив из 50 массивов размером 8 (51 объект). new int[8][50]
- это массив из 8 массивов размером 50 (9 объектов). 9 объектов будут иметь меньшие накладные расходы, чем 51. new int[400]
- это всего лишь один объект.
Однако при таком размере он, вероятно, не может измерить разницу в производительности вашей программы. Возможно, вы захотите инкапсулировать массив (ы) в объект, который позволит вам изменить реализацию и обеспечить более естественный интерфейс для кода клиента.
вам не хватает 8 отдельных массивов для каждого из 50 объектов. это все о том, что есть что хранить 8 списков переменных, а не 50. – William
Накладные расходы на наличие объекта будут более значительными, чем накладные расходы на ссылку на него, как в памяти, так и в ЦП. –
Вы можете настроить крошечный объем памяти с помощью массива int [] myInt = int [400] и вручную получить доступ к int в позиции (x, y) с помощью myInt [x + y * 50] , который сэкономит вам 50 32-битных фрагментов памяти. доступ к нему таким образом может быть (кто точно знает, что делает компилятор hotspot) ... возьмите еще одну инструкцию для умножения.
Такая микро-оптимизация, скорее всего, не заставит ваше приложение работать лучше, и это уменьшит читаемость.
Я не эксперт в компиляторе Java, но это похоже на то, что компилятор, вероятно, сделает для вас в любом случае. Кто-нибудь знает, если это так? –
один пункт Useage (пришел из ссылки я, к сожалению, не могу сейчас найти, но достаточно здравого смысла) -
Авторы этой работы были тестирование различных способов сжатия разреженных массивов в mutidimensional массивы. Одна вещь, которую они заметили, что она делает разницу в скорости, которые, как вы итерацию -
Идея заключалась в том, что если у вас есть ИНТ [я] [J] он был быстрее сделать
for (i) {
for (j)
чем
for (j) {
for (i)
потому что в первом случае вы повторяете элементы, хранящиеся в соприкосновении.
Да, правда даже для «реальных» многомерных массивов. –
Предлагаю написать небольшой тест производительности для этого с очень большими массивами, чтобы увидеть фактическую разницу.На самом деле я не думаю, что это будет иметь малейшее значение.
INT [50] [8] 50 массивов длины 8 Int [8] [50] имеет 8 массивы длиной 50 INT [400] является одним массивом 400. Каждый массив имеет накладных расходов около 16 байт.
Однако для размеров, которые у вас есть здесь, это действительно не имеет значения. Вы не собираетесь спасти многое в любом случае.
У вас есть образец кода, который мы можем проверить? – OscarRyz
Что вы пытаетесь достичь? Если у вас проблемы с производительностью, это, вероятно, не связано с тем, как вы организуете свои массивы. – starblue