Используют ли 2D-массивы больше ресурсов, чем 1D-массивы в Java? - PullRequest
1 голос
/ 23 февраля 2009

Например, будет ли полный int [50] [8] использовать больше ресурсов (ОЗУ и ЦП), чем 8 полных массивов int [50]?

Ответы [ 6 ]

4 голосов
/ 23 февраля 2009

В первом случае у вас есть один объект массива, указывающий на пятьдесят объектов массива, содержащих 8 целых чисел. Таким образом, 1 + 50 объектов массива + пятьдесят указателей в первом объекте массива.

Во втором случае у вас есть один объект массива, указывающий на 8 объектов массива, содержащих 50 int. Таким образом, 1 + 8 объектов массива + восемь указателей в первом объекте массива. Проведение int это стирка.

Нет хорошего способа оценить загрузку процессора для этого.

1 голос
/ 23 февраля 2009

Одна дополнительная точка использования (взято из ссылки, которую я, к сожалению, пока не могу найти, но довольно здравый смысл) -

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

Идея состояла в том, что если у вас есть int [i] [j], это будет быстрее сделать

for (i) { 
     for (j)

чем заняться

for (j) { 
     for (i)

потому что в первом случае вы перебираете элементы, хранящиеся непрерывно.

1 голос
/ 23 февраля 2009

Здесь есть три вещи для сравнения.

  • new int[50][8]
  • new int[8][50]
  • new int[400]

Теперь, я запутался, но способ помнить - думать о new int[50][], который действителен.

Итак, new int[50][8] - это массив из 50 массивов размером 8 (51 объект). new int[8][50] - это массив из 8 массивов размером 50 (9 объектов). 9 объектов будут иметь более низкие издержки, чем 51. new int[400] - это всего лишь один объект.

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

0 голосов
/ 23 февраля 2009

int [50] [8] - это 50 массивов длины 8 int [8] [50] - это 8 массивов длиной 50 int [400] - это один массив 400. Каждый массив имеет накладные расходы около 16 байтов.

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

0 голосов
/ 23 февраля 2009

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

0 голосов
/ 23 февраля 2009

Вы можете настроить крошечный объем памяти, используя массив int [] myInt = int [400] и вручную получая доступ к int в позиции (x, y) с помощью myInt [x + y * 50] это сэкономит вам 50 32-битных фрагментов памяти. доступ к нему таким образом может (кто точно знает, что компилятор hotspot делает с этим ..) потребует еще одну инструкцию для умножения.

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

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